- Segfault
-
Ошибка сегментации (англ. Segmentation fault или сокращённо segfault) — ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом. В системах на основе процессоров Motorola 68000 эти ошибки, как правило, известны как ошибки адреса или шины.
Сегментная адресация памяти является одним из подходов к управлению и защите памяти в операционной системе. Для большинства целей она была вытеснена страничной памятью, однако в документациях по традиции используют термин «Ошибка сегментации». Некоторые операционные системы до сих пор используют сегментацию на некоторых логических уровнях, а страничная память используется в качестве основной политики управления памятью.
В UNIX-подобных операционных системах процесс, обращающийся к недействительным участкам памяти, получает сигнал Microsoft Windows, процесс, получающий доступ недействительным участкам памяти, создаёт исключение STATUS_ACCESS_VIOLATION, и, как правило, показывает пользователю окно с предложением отправить отчёт об ошибке Microsoft.
Пример
Вот пример кода ANSI C, который приводит к ошибке сегментации на платформах с защитой памяти:
char *s = "hello world"; *s = 'H';
Когда программа, содержащая этот код, скомпилирована, строка «hello world» размещена в секции программы с бинарной пометкой «только для чтения». При запуске операционная система помещает её с другими строками и константами в сегмент памяти, предназначенный только для чтения. После запуска переменная s указывает на адрес строки, а попытка присвоить значение символьной константы H через переменную в памяти приводит к ошибке сегментации.
Компиляция и запуск таких программ на
$ 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(); }
См. также
Ссылки
- http://www.faqs.org/qa/qa-673.html (англ.)
- http://c-faq.com/null/null1.html (англ.)
- http://c-faq.com/null/varieties.html (англ.)
Операционная система Ядро Микроядро • Монолитное ядро • Гибридное ядро • Пространство ядра (kernel space) • Модульное ядро • Наноядро • Драйвер • Пространство пользователя • Область пользователя • Экзоядро
Управление
процессомПроцесс • Мультипрограммирование • Прерывание • Защищённый режим (кольца защиты) • Режим супервизора • Многозадачность • Многопоточность • Управление процессом • Планировщик задач • Переключение контекста • Кооперативная многозадачность • Вытесняющая многозадачность • Режимы работы процессора
Управление
памятьюЗащита памяти • Сегментация памяти • Страничная память (Paging) • Блок управления памятью • Ошибка сегментации • Общая ошибка защиты
Примеры
Wikimedia Foundation. 2010.