Ошибка сегментации
Ошибка сегментации (англ. Segmentation fault, сокр. segfault, жарг. сегфолт) — ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменить память запрещённым способом. В системах на основе процессоров Motorola 6800 эти ошибки, как правило, известны как ошибки адреса или шины.
В UNIX-подобных операционных системах процесс, обращающийся к недействительным участкам памяти, получает сигнал SIGSEGV. В Microsoft Windows процесс, получающий доступ к недействительным участкам памяти, создаёт исключение STATUS_ACCESS_VIOLATION (определение для кода 0xC0000005) и, как правило, предлагает запустить отладчик приложения и показывает пользователю окно с предложением отправить отчёт об ошибке в Microsoft.
Пример
Вот пример кода ANSI C, который приводит к ошибке сегментации из-за присутствия квалификатора типа const:
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 на GNU/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() { const int nmax = 10; int i, n, a[n]; } Достоверность этой статьи поставлена под сомнение. |
Компилятор G++ не прослеживает такую ошибку при компоновке, что при запуске скомпилированной программы может вызвать ошибку сегментации.
См. также
- Переполнение буфера
Примечания
- NTSTATUS (англ.). Дата обращения: 27 января 2022. Архивировано 27 января 2022 года.
Ссылки
- http://www.faqs.org/qa/qa-673.html (англ.) Архивная копия от 28 марта 2008 на Wayback Machine
- http://c-faq.com/null/null1.html Архивировано 26 февраля 2013 года.
- http://c-faq.com/null/varieties.html Архивная копия от 18 августа 2011 на Wayback Machine
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Ошибка сегментации, Что такое Ошибка сегментации? Что означает Ошибка сегментации?
Oshibka segmentacii angl Segmentation fault sokr segfault zharg segfolt oshibka programmnogo obespecheniya voznikayushaya pri popytke obrasheniya k nedostupnym dlya zapisi uchastkam pamyati libo pri popytke izmenit pamyat zapreshyonnym sposobom V sistemah na osnove processorov Motorola 6800 eti oshibki kak pravilo izvestny kak oshibki adresa ili shiny V UNIX podobnyh operacionnyh sistemah process obrashayushijsya k nedejstvitelnym uchastkam pamyati poluchaet signal SIGSEGV V Microsoft Windows process poluchayushij dostup k nedejstvitelnym uchastkam pamyati sozdayot isklyuchenie STATUS ACCESS VIOLATION opredelenie dlya koda 0xC0000005 i kak pravilo predlagaet zapustit otladchik prilozheniya i pokazyvaet polzovatelyu okno s predlozheniem otpravit otchyot ob oshibke v Microsoft PrimerVot primer koda ANSI C kotoryj privodit k oshibke segmentacii iz za prisutstviya kvalifikatora tipa a href wiki Const D0 BF D1 80 D0 BE D0 B3 D1 80 D0 B0 D0 BC D0 BC D0 B8 D1 80 D0 BE D0 B2 D0 B0 D0 BD D0 B8 D0 B5 title Const programmirovanie const a const char s hello world char s H Kogda programma soderzhashaya etot kod skompilirovana stroka hello world razmeshena v sekcii programmy s binarnoj pometkoj tolko dlya chteniya Pri zapuske operacionnaya sistema pomeshaet eyo s drugimi strokami i konstantami v segment pamyati prednaznachennyj tolko dlya chteniya Posle zapuska peremennaya s ukazyvaet na adres nachala stroki a popytka prisvoit znachenie simvolnoj konstanty H cherez peremennuyu v pamyati privodit k oshibke segmentacii Kompilyaciya i zapusk takih programm na OpenBSD 4 0 vyzyvaet sleduyushuyu oshibku vypolneniya gcc segfault c g o segfault segfault Segmentation fault Vyvod otladchika gdb Program received signal SIGSEGV Segmentation fault 0x1c0005c2 in main at segfault c 6 6 s H V otlichie ot etogo GCC 4 1 1 na GNU Linux vozvrashaet oshibku eshyo vo vremya kompilyacii gcc segfault c g o segfault segfault c In function main segfault c 4 error assignment of read only location Usloviya pri kotoryh proishodyat narusheniya segmentacii i sposoby ih proyavleniya zavisyat ot operacionnoj sistemy Etot primer koda sozdayot nulevoj ukazatel i pytaetsya prisvoit znachenie po nesushestvuyushemu adresu Eto vyzyvaet oshibki segmentacii vo vremya vypolneniya programmy na mnogih sistemah int ptr int 0 ptr 1 Eshyo odin sposob vyzvat oshibku segmentacii zaklyuchaetsya v tom chtoby vyzvat funkciyu main rekursivno chto privedyot k perepolneniyu steka int main main Obychno oshibka segmentacii proishodit potomu chto ukazatel nulevoj ukazatel ukazyvaet na proizvolnyj uchastok pamyati vozmozhno potomu chto ne byl inicializirovan ukazatel ukazyvaet na udalyonnyj uchastok pamyati Naprimer char p1 NULL inicializirovan kak nulevoj eto dopuskaetsya no na mnogih sistemah on ne mozhet byt razymenovan char p2 voobshe ne inicializirovan ukazyvaet na proizvolnyj adres v pamyati char p3 char malloc 20 horosho uchastok pamyati vydelen free p3 no teper ego bolshe net Teper razymenovanie lyubogo iz etih ukazatelej mozhet vyzvat oshibku segmentacii Ili pri ispolzovanii massivov esli sluchajno ukazat v kachestve razmera massiva neinicializirovannuyu peremennuyu int main const int nmax 10 int i n a n Dostovernost etoj stati postavlena pod somnenie Neobhodimo proverit tochnost faktov i dostovernost svedenij izlozhennyh v etoj state Sootvetstvuyushuyu diskussiyu mozhno najti na stranice obsuzhdeniya 14 marta 2012 Kompilyator G ne proslezhivaet takuyu oshibku pri komponovke chto pri zapuske skompilirovannoj programmy mozhet vyzvat oshibku segmentacii Sm takzhePerepolnenie buferaPrimechaniyaNTSTATUS angl Data obrasheniya 27 yanvarya 2022 Arhivirovano 27 yanvarya 2022 goda Ssylkihttp www faqs org qa qa 673 html angl Arhivnaya kopiya ot 28 marta 2008 na Wayback Machine http c faq com null null1 html Arhivirovano 26 fevralya 2013 goda http c faq com null varieties html Arhivnaya kopiya ot 18 avgusta 2011 na Wayback Machine
