Ошибка сегментации 14.04, но не ошибка 10.04

Я использую Ubuntu 14.04 64bit LTS и пишу программу обработки изображений на C. Когда я запускаю любую программу в терминале, это показывает ошибку сегментации (ядро сброшено).
Эта же программа прекрасно работает в 10.04.

Любая помощь, пожалуйста?

$ cc -o out.e sub.c -lm
$ ./out.e
Segmentation fault (core dumped)

1 ответ

Трудно сказать, что на самом деле произошло, но я приведу пример такого рода проблемы.

Важно то, что программа работала 10.04, но не работала 14.0. Точная проблема может быть другой, но похожей и связанной:

Что-то против правил

Ошибка "ошибка сегментации" обычно означает доступ к некоторой памяти, которая не принадлежит программе. Может случиться так, что и 10.04, и 14.04 был такой незаконный доступ к памяти, но он не вызвал никаких проблем 10.04.

Правила не строго соблюдаются

Это означало бы, что это сработало случайно в 10.04; Это вполне возможно, потому что по многим причинам память, находящаяся рядом с "официальной" памятью вашей программы, может также технически принадлежать вашей программе.
Это делается для того, чтобы компилятору было легче думать, или чтобы программа работала быстрее благодаря более регулярному доступу к памяти.
Таким образом, программе может быть разрешено делать то, что ей запрещено делать, основываясь на тексте программы.

Терпимость может измениться

Какая "неофициальная" память доступна без ошибки сегментации, зависит от версии компилятора и версий библиотеки, которые изменились.

Простейшим и наиболее распространенным случаем должно быть то, что в программе есть ошибка, из-за которой доступ к памяти зашел слишком далеко, например, доступ к байту после массива из-за ошибки "один за другим" в индексе.

Резюме

Ошибка существовала и раньше, но все равно работала.
Теперь это не работает, и это просто нормальная ошибка, которая вызывает ошибку сегментации.

Для положительного аспекта: когда это работало, с ошибкой, это могло привести к неправильным результатам - что намного хуже, чем сбой, который вы видите сейчас.


Применять правила

Хороший подход к устранению подобных проблем состоит в том, чтобы заставить программу применять правила, которые не применяются обычной системой времени выполнения.
Один из способов сделать это при поиске проблемы с доступом к памяти - это valgrind (man valgrind).

Другие вопросы по тегам