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

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

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

Помогите, пожалуйста.

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

решение1

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

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

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

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

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

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

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

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

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

Краткое содержание

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

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


Обеспечивать соблюдение правил

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

Связанный контент