LINUX.ORG.RU

История изменений

Исправление Kroz, (текущая версия) :

вот поэтому:
int b = *x;

И что?

In computing, a segmentation fault (often shortened to segfault) or access violation is a fault, or failure condition, raised by hardware with memory protection, notifying an operating system (OS) the software has attempted to access a restricted area of memory (a memory access violation).

И почему вдруг память, в которой был локальная переменная x вдруг стала restricted?

В моем понимании программа может дотянуться до любой памяти, при условии что эта память аллоцирована под эту программу. Я могу допустить, что нельзя модифицировать память с кодом (то, что есть сегмент кода в реально режиме). Но почему область данных (пусть даже в стеке) сначала принадлежала программе, а потом перестала принадлежать, я понять не могу. Это ж нужно по выходу из функции специально флаги проставлять или что-то другое делать. Но в Си это лишнее ИМХО, ну, или по крайней мере должно включаться/выключаться в флагах компилятора.

P. S. А вообще похоже на оптимизацию. Потенциально, компилятор может понять, что функция a() не делает ничего, и просто исключить ее из кода. Или хранить переменную x в регистрах. Тогда, можно залезть restricted area of memory.

Если это так, то на Микрософт эффект уйдет если отключить все оптимизации. А в gcc эффект может появиться, если включить максимальные оптимизации.

Исходная версия Kroz, :

вот поэтому:
int b = *x;

И что?

In computing, a segmentation fault (often shortened to segfault) or access violation is a fault, or failure condition, raised by hardware with memory protection, notifying an operating system (OS) the software has attempted to access a restricted area of memory (a memory access violation).

И почему вдруг память, в которой был локальная переменная x вдруг стала restricted?

В моем понимании программа может дотянуться до любой памяти, при условии что эта память аллоцирована под эту программу. Я могу допустить, что нельзя модифицировать память с кодом (то, что есть сегмент кода в реально режиме). Но почему область данных сначала принадлежала программе, а потом перестала принадлежать, я понять не могу. Это ж нужно по выходу из функции специально флаги проставлять или что-то другое делать. Но в Си это лишнее ИМХО, ну, или по крайней мере должно включаться/выключаться в флагах компилятора.

P. S. А вообще похоже на оптимизацию. Потенциально, компилятор может понять, что функция a() не делает ничего, и просто исключить ее из кода. Или хранить переменную x в регистрах. Тогда, можно залезть restricted area of memory.

Если это так, то на Микрософт эффект уйдет если отключить все оптимизации. А в gcc эффект может появиться, если включить максимальные оптимизации.