2016-04-07 4 views
1

После прочтения следующего question, я понимаю, что такой вещи нет (по крайней мере, не «портативный»).Как написать функцию, возвращающую указатель на стек

Однако я в главной роли в следующем piece of code из кодовой базы моно, которые возвращают указатель на стек:

static void * 
return_stack_ptr() 
{ 
    gpointer i; 
    return &i; 
} 

Я удивлен, что приведенный выше код может работать даже на арке, таких как PowerPC, я бы предположили, что это будет работать только на x86 (и, возможно, только gcc).

Будет ли это работать на PowerPC?

+1

Нет переносной функции, которая могла бы вернуть указатель на стек в C. Есть только степени неспортивности. –

+0

Этот вид вещей зависит от платформы и компилятора. –

+0

У PowerPC ABI есть понятие памяти стека, но ваш компилятор может поместить переменную 'i' в другую память, отличную от стека. Тем не менее, я бы сказал, что он будет работать с любым основным компилятором PowerPC – atturri

ответ

4

Назначение стека поддерживает вызовы функций и локальные переменные. Если ваша система имеет стек, она будет использовать его и выделяет локальную переменную. Поэтому очень разумно предположить, что адрес локальной переменной указывает где-то в стеке. Это не относится к x86 или gcc - это довольно общая идея.

Однако использование указателя на переменную, которая не существует (то есть после ее выхода из области видимости), является неопределенным поведением. Поэтому эта функция не может гарантировать ничего значимого. Фактически, «умный» компилятор мог обнаружить, что ваша программа использует неопределенное поведение и заменяет ваш код на no-op (и называет его «оптимизацией производительности»).

В качестве альтернативы, «мудрый» компилятор мог бы распознать, что ваша функция возвращает указатель на стек и встраивает его с помощью указателя аппаратного стека.

Ни один вариант не гарантируется - этот код не переносится.

+2

Обратите внимание, что простой акт _having_ указателя, который был когда-то действительным, сам по себе не является UB. Это просто нормальное состояние после возвращения 'free (ptr)', например. – MSalters

Смежные вопросы