Разница между ошибкой сегментации и сбросом ядра ошибки сегментации - PullRequest
5 голосов
/ 25 октября 2011

рассмотрим следующий код в C

int n;
scanf("%d",n)

выдает ошибку ошибки сегментации ядра, сброшенную в компилятор GCC в Linux Mandriva

но следующий код

int *p=NULL;
*P=8;

дает только ошибку сегментации, почему это так? ..

Ответы [ 3 ]

4 голосов
/ 25 октября 2011

A core dump - это файл, содержащий дамп состояния и памяти программы в момент ее сбоя. Поскольку дампы ядра могут занимать нетривиальные объемы дискового пространства, существует настраиваемый предел их размера. Вы можете видеть это с ulimit -c.

Теперь, когда вы получаете ошибку сегментации, действие по умолчанию - завершить процесс и сбросить ядро. Ваша оболочка сообщает, что произошло, если процесс завершился с сигналом сбоя сегментации, он напечатает Segmentation fault, и если этот процесс дополнительно сбросил ядро ​​(когда параметр ulimit и разрешения для каталога, в котором находится дамп ядра) быть сгенерированным, разрешить это), это вам так скажет.

1 голос
/ 25 октября 2011

Предполагая, что вы используете оба из них в одной и той же системе с одинаковыми настройками ulimit -c (что было бы моим первым предположением относительно разницы, которую вы видите), то, возможно, оптимизатор "заметил"явно неопределенное поведение во втором примере и генерирование собственного выхода.Вы можете проверить с помощью objdump -x.

0 голосов
/ 25 октября 2011

В первом случае 'n' может иметь любое значение, вам может принадлежать эта память (или нет), она может быть доступна для записи (или нет), но, вероятно, существует. Нет причины, по которой n обязательно равно нулю.

Запись в NULL определенно непослушна, и операционная система заметит это!

...