Ошибка сегментации

Ошибка сегментации

Ошибка сегментации (англ. Segmentation fault или сокращённо segfault) — ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом. В системах на основе процессоров Motorola 68000 эти ошибки, как правило, известны как ошибки адреса или шины.

Сегментная адресация памяти является одним из подходов к управлению и защите памяти в операционной системе. Для большинства целей она была вытеснена страничной памятью[источник не указан 622 дня], однако в документациях по традиции используют термин «Ошибка сегментации». Некоторые операционные системы до сих пор используют сегментацию на некоторых логических уровнях, а страничная память используется в качестве основной политики управления памятью.

В UNIX-подобных операционных системах процесс, обращающийся к недействительным участкам памяти, получает сигнал SIGSEGV. В Microsoft Windows, процесс, получающий доступ к недействительным участкам памяти, создаёт исключение STATUS_ACCESS_VIOLATION, и, как правило, запускает программу Dr. Watson, которая показывает пользователю окно с предложением отправить отчёт об ошибке Microsoft.

Пример

Вот пример кода ANSI C, который приводит к ошибке сегментации на платформах с защитой памяти:

 const char *s = "hello world";
 *(char *)s = 'H';

Когда программа, содержащая этот код, скомпилирована, строка «hello world» размещена в секции программы с бинарной пометкой «только для чтения». При запуске операционная система помещает её с другими строками и константами в сегмент памяти, предназначенный только для чтения. После запуска переменная s указывает на адрес строки, а попытка присвоить значение символьной константы H через переменную в памяти приводит к ошибке сегментации.

Компиляция и запуск таких программ на OpenBSD 4.0 вызывает следующую ошибку выполнения:

$ gcc segfault.c -g -o segfault
$ ./segfault
Segmentation fault

Вывод отладчика gdb:

Program received signal SIGSEGV, Segmentation fault.
0x1c0005c2 in main () at segfault.c:6
6               *s = 'H';

} В отличие от этого, gcc 4.1.1 на Linux возвращает ошибку ещё во время компиляции:

$ gcc segfault.c -g -o segfault
segfault.c: In function ‘main’:
segfault.c:4: error: assignment of read-only location

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

Этот пример кода создаёт нулевой указатель и пытается присвоить значение по несуществующему адресу. Это вызывает ошибки сегментации во время выполнения программы на многих системах.

 int* ptr = (int*)0;
 *ptr = 1;

Ещё один способ вызвать ошибку сегментации заключается в том, чтобы вызвать функцию main рекурсивно, что приведёт к переполнению стека:

 int main()
 {
     main();
 }

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

Например,

    char* p1 = NULL;  /* инициализирован как нулевой, в чем нет ничего плохого, но на многих системах он не может быть разыменован */
    char* p2;  /* вообще не инициализирован */
    char* p3  = (char *)malloc(20);  /* хорошо, участок памяти выделен */
    free(p3);  /* но теперь его больше нет */

Теперь разыменование любого из этих указателей может вызвать ошибку сегментации.

Также, при использовании массивов, если случайно указать вместо максимального размера массива его текущий. Вот пример :

int main()
{ int const nmax=10;
  int i,n,a[n];
}


такая ошибка не прослеживается g++ при линковке, но при запуске приложения вызовет ошибку сегментации.

См. также

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать курсовую

Полезное


Смотреть что такое "Ошибка сегментации" в других словарях:

  • Segfault — Ошибка сегментации (англ. Segmentation fault или сокращённо segfault)  ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом. В системах… …   Википедия

  • Segmentation fault — Ошибка сегментации (англ. Segmentation fault или сокращённо segfault)  ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом. В системах… …   Википедия

  • Защита памяти — (англ. Memory protection)  это способ управления правами доступа к отдельным регионам памяти. Используется большинством многозадачных операционных систем. Основной целью защиты памяти является запрет доступа процессу к той памяти,… …   Википедия

  • SIGSEGV — Описание: Исключение при обращении в память По умолчанию: завершение с дампом памяти коды SA SIGINFO SEGV MAPERR Обращение к незадействованной странице SEGV ACCERR Нарушение прав доступа к странице В POSIX системах, SIGSEGV  сигнал,… …   Википедия

  • Процесс (информатика) — У этого термина существуют и другие значения, см. Процесс. Статусы процессов в современных ОС. Процесс  выполнение пассивных инструкций …   Википедия

  • Операционная система — У этого термина существуют и другие значения, см. Операционная система (значения). Запрос «OS» перенаправляется сюда; см. также другие значения. Операционная система, сокр. ОС (англ. operating system, OS)  комплекс управляющих и… …   Википедия

  • Ядро операционной системы — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете …   Википедия

  • Микроядро — У этого термина существуют и другие значения, см. Микроядро (цитология). Архитектура микроядра основывается на программах серверах пользовательского режима …   Википедия

  • Микроядерная операционная система — Архитектура микроядра основывается на программах серверах пользовательского режима Микроядро  это минимальная реализация функций ядра операционной системы. Классические микроядра предоставляют лишь очень небольшой набор низкоуровневых примитивов …   Википедия

  • Ядро (операционной системы) — У этого термина существуют и другие значения, см. Ядро. Ядро центральная часть операционной системы (ОС), обеспечивающая приложениям координированный доступ к ресурсам компьютера, таким как процессорное время, память и внешнее аппаратное… …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»