[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/errors/linux/segfault-c":3,"mdc-jxolim-key":557,"mdc-yiuxo9-key":567,"mdc-mr29ck-key":598,"mdc--gv2j52-key":614,"mdc-oz57cd-key":622,"mdc--x6v2kn-key":652,"mdc-kxu7xs-key":677,"mdc-55c7jx-key":694,"mdc--c5rpdk-key":702,"related-/errors/linux/segfault-python,/guides/linux/debugging":719},{"id":4,"title":5,"appliesTo":6,"author":8,"body":9,"canonical":490,"code":491,"createdAt":492,"description":493,"difficulty":494,"draft":495,"estimatedTime":496,"extension":497,"faq":498,"howToSteps":511,"howToTotalTime":527,"image":490,"keywords":528,"locale":534,"meta":535,"navigation":536,"path":537,"platform":538,"related":539,"section":542,"seo":543,"severity":544,"stem":545,"summary":546,"tags":547,"twitterCreator":490,"twitterSite":490,"type":555,"updatedAt":492,"__hash__":556},"content_ru/errors/linux/segfault-c.md","Исправление segmentation fault (SIGSEGV) в программах на C под Linux",[7],"GCC 11+, Clang 14+, Ubuntu 22.04, Debian 12, Fedora 38","FixPedia Team",{"type":10,"value":11,"toc":479},"minimark",[12,17,21,42,45,55,58,64,68,119,123,127,130,178,183,187,190,224,227,233,236,240,243,256,259,265,268,272,275,306,309,366,370,381,411,414,417,421,472,475],[13,14,16],"h2",{"id":15},"что-означает-ошибка-sigsegv","Что означает ошибка SIGSEGV",[18,19,20],"p",{},"Segfault (сигнал SIGSEGV) — это авария, при которой программа на C пытается прочитать или записать память, которая не принадлежит ей. Операционная система прерывает процесс, чтобы предотвратить повреждение данных или сбой системы. Типичные причины:",[22,23,24,33,36,39],"ul",{},[25,26,27,28,32],"li",{},"Использование ",[29,30,31],"code",{},"NULL","-указателя или указателя, который никогда не был инициализирован.",[25,34,35],{},"Выход за границы массива или буфера.",[25,37,38],{},"Попытка освободить память дважды или обратиться к уже освобождённой памяти.",[25,40,41],{},"Нарушение правил выравнивания при работе с указателями.",[18,43,44],{},"Сообщение об ошибке обычно выглядит так:",[46,47,52],"pre",{"className":48,"code":50,"language":51},[49],"language-text","Segmentation fault (core dumped)\n","text",[29,53,50],{"__ignoreMap":54},"",[18,56,57],{},"или, если используется GDB:",[46,59,62],{"className":60,"code":61,"language":51},[49],"Примечание: программа только что вызвала прерывание SIGSEGV.\n(gdb) bt\n#0  0x0000555555555a5f в 0x...\n",[29,63,61],{"__ignoreMap":54},[13,65,67],{"id":66},"причины-возникновения","Причины возникновения",[69,70,71,81,87,96,105,113],"ol",{},[25,72,73,77,78,80],{},[74,75,76],"strong",{},"Нулевой указатель"," – чтение/запись по адресу ",[29,79,31],{},".",[25,82,83,86],{},[74,84,85],{},"Выход за границы массива"," – доступ к элементу за пределами выделенного массива.",[25,88,89,92,93,95],{},[74,90,91],{},"Ошибки с указателями на функции"," – вызов ",[29,94,31],{},"- или повреждённого указателя на функцию.",[25,97,98,101,102,80],{},[74,99,100],{},"Освобождение памяти дважды"," – повторный вызов ",[29,103,104],{},"free",[25,106,107,110,111,80],{},[74,108,109],{},"Использование памяти после освобождения"," – чтение данных после ",[29,112,104],{},[25,114,115,118],{},[74,116,117],{},"Нарушение выравнивания"," – доступ к типу, требующему определённого выравнивания, по неправильному адресу.",[13,120,122],{"id":121},"способы-решения","Способы решения",[13,124,126],{"id":125},"способ-1-отладка-с-помощью-gdb","Способ 1: Отладка с помощью GDB",[18,128,129],{},"GDB позволяет остановить процесс непосредственно в момент сбоя и получить трассировку стека.",[46,131,135],{"className":132,"code":133,"language":134,"meta":54,"style":54},"language-bash shiki shiki-themes github-light github-dark","gdb ./a.out          # запустить GDB\nrun                  # выполнить программу\n# когда программа упадёт:\nbacktrace            # показать стек вызовов\n","bash",[29,136,137,154,163,169],{"__ignoreMap":54},[138,139,142,146,150],"span",{"class":140,"line":141},"line",1,[138,143,145],{"class":144},"sScJk","gdb",[138,147,149],{"class":148},"sZZnC"," ./a.out",[138,151,153],{"class":152},"sJ8bj","          # запустить GDB\n",[138,155,157,160],{"class":140,"line":156},2,[138,158,159],{"class":144},"run",[138,161,162],{"class":152},"                  # выполнить программу\n",[138,164,166],{"class":140,"line":165},3,[138,167,168],{"class":152},"# когда программа упадёт:\n",[138,170,172,175],{"class":140,"line":171},4,[138,173,174],{"class":144},"backtrace",[138,176,177],{"class":152},"            # показать стек вызовов\n",[18,179,180,182],{},[29,181,174],{}," показывает функции, вызванные перед падением, что помогает быстро найти проблемную строку.",[13,184,186],{"id":185},"способ-2-использовать-addresssanitizer-asan","Способ 2: Использовать AddressSanitizer (ASan)",[18,188,189],{},"Добавьте инструмент обнаружения ошибок при компиляции:",[46,191,193],{"className":132,"code":192,"language":134,"meta":54,"style":54},"gcc -fsanitize=address -g -O0 main.c -o prog\n./prog\n",[29,194,195,219],{"__ignoreMap":54},[138,196,197,200,204,207,210,213,216],{"class":140,"line":141},[138,198,199],{"class":144},"gcc",[138,201,203],{"class":202},"sj4cs"," -fsanitize=address",[138,205,206],{"class":202}," -g",[138,208,209],{"class":202}," -O0",[138,211,212],{"class":148}," main.c",[138,214,215],{"class":202}," -o",[138,217,218],{"class":148}," prog\n",[138,220,221],{"class":140,"line":156},[138,222,223],{"class":144},"./prog\n",[18,225,226],{},"ASan выведет отчёт, например:",[46,228,231],{"className":229,"code":230,"language":51},[49],"==32098==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x61000040 at pc 0x...\nREAD of size 4 at 0x61000040 thread T0\n...\n",[29,232,230],{"__ignoreMap":54},[18,234,235],{},"Теперь вы точно знаете, где произошёл выход за границы буфера.",[13,237,239],{"id":238},"способ-3-запустить-программу-под-valgrind","Способ 3: Запустить программу под Valgrind",[18,241,242],{},"Valgrind симулирует выполнение и отслеживает доступ к памяти:",[46,244,246],{"className":132,"code":245,"language":134,"meta":54,"style":54},"valgrind ./prog\n",[29,247,248],{"__ignoreMap":54},[138,249,250,253],{"class":140,"line":141},[138,251,252],{"class":144},"valgrind",[138,254,255],{"class":148}," ./prog\n",[18,257,258],{},"Пример вывода:",[46,260,263],{"className":261,"code":262,"language":51},[49],"==32100== Invalid read of size 1, at 0x61000040 ...\n==32100==    by 0x4008d6 в my_function ...\n",[29,264,262],{"__ignoreMap":54},[18,266,267],{},"Valgrind также показывает номер строки и имя файла.",[13,269,271],{"id":270},"способ-4-исправить-выявлённую-ошибку","Способ 4: Исправить выявлённую ошибку",[18,273,274],{},"После получения отчёта отладчика:",[22,276,277,283,289,303],{},[25,278,279,280,282],{},"Проверьте указатели на ",[29,281,31],{},", прежде чем использовать их.",[25,284,285,286,80],{},"Убедитесь, что индексы массивов находятся в пределах ",[29,287,288],{},"[0, size-1]",[25,290,291,292,295,296,295,299,302],{},"Используйте безопасные функции (",[29,293,294],{},"strncpy",", ",[29,297,298],{},"fgets",[29,300,301],{},"snprintf",").",[25,304,305],{},"Следите за выделением и освобождением памяти: выделяйте один раз и освобождайте один раз.",[18,307,308],{},"Пример исправления:",[46,310,314],{"className":311,"code":312,"language":313,"meta":54,"style":54},"language-c shiki shiki-themes github-light github-dark","char *ptr = NULL;\nptr = malloc(len);\nif (!ptr) {\n    perror(\"malloc\");\n    return 1;\n}\nstrncpy(ptr, src, len - 1);\nptr[len - 1] = '\\0';\nfree(ptr);\n","c",[29,315,316,321,326,331,336,342,348,354,360],{"__ignoreMap":54},[138,317,318],{"class":140,"line":141},[138,319,320],{},"char *ptr = NULL;\n",[138,322,323],{"class":140,"line":156},[138,324,325],{},"ptr = malloc(len);\n",[138,327,328],{"class":140,"line":165},[138,329,330],{},"if (!ptr) {\n",[138,332,333],{"class":140,"line":171},[138,334,335],{},"    perror(\"malloc\");\n",[138,337,339],{"class":140,"line":338},5,[138,340,341],{},"    return 1;\n",[138,343,345],{"class":140,"line":344},6,[138,346,347],{},"}\n",[138,349,351],{"class":140,"line":350},7,[138,352,353],{},"strncpy(ptr, src, len - 1);\n",[138,355,357],{"class":140,"line":356},8,[138,358,359],{},"ptr[len - 1] = '\\0';\n",[138,361,363],{"class":140,"line":362},9,[138,364,365],{},"free(ptr);\n",[13,367,369],{"id":368},"способ-5-статический-анализ-кода","Способ 5: Статический анализ кода",[18,371,372,373,376,377,380],{},"Статические анализаторы, такие как ",[29,374,375],{},"clang-check"," или ",[29,378,379],{},"cppcheck",", могут обнаружить ошибки до компиляции:",[46,382,384],{"className":132,"code":383,"language":134,"meta":54,"style":54},"clang-check main.c -- -Wall -Wextra\ncppcheck --enable=warning main.c\n",[29,385,386,401],{"__ignoreMap":54},[138,387,388,390,392,395,398],{"class":140,"line":141},[138,389,375],{"class":144},[138,391,212],{"class":148},[138,393,394],{"class":202}," --",[138,396,397],{"class":202}," -Wall",[138,399,400],{"class":202}," -Wextra\n",[138,402,403,405,408],{"class":140,"line":156},[138,404,379],{"class":144},[138,406,407],{"class":202}," --enable=warning",[138,409,410],{"class":148}," main.c\n",[18,412,413],{},"Они часто предупреждают о потенциальных проблемах с указателями, использовании памяти и выходе за границы массива.",[415,416],"in-article-ad",{},[13,418,420],{"id":419},"профилактика","Профилактика",[22,422,423,432,438,451,457,466],{},[25,424,425,428,429,80],{},[74,426,427],{},"Проверяйте указатели"," перед использованием: ",[29,430,431],{},"if (!ptr) handle_error();",[25,433,434,437],{},[74,435,436],{},"Используйте безопасные функции"," из стандартной библиотеки, которые ограничивают размер копирования.",[25,439,440,443,444,295,447,450],{},[74,441,442],{},"Включайте инструменты обнаружения ошибок"," (",[29,445,446],{},"-fsanitize=address",[29,448,449],{},"-fsanitize=undefined",") в CI-пайплайнах.",[25,452,453,456],{},[74,454,455],{},"Регулярно запускайте Valgrind/AddressSanitizer"," при локальной разработке.",[25,458,459,462,463,302],{},[74,460,461],{},"Проводите статический анализ"," перед коммитом (например, ",[29,464,465],{},"clang-tidy",[25,467,468,471],{},[74,469,470],{},"Следите за версиями компилятора",": новые версии GCC/Clang улучшают диагностику.",[18,473,474],{},"Регулярное тестирование и внимательность к предупреждениям от компилятора помогут избежать segfault в продакшн-коде.",[476,477,478],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":54,"searchDepth":156,"depth":156,"links":480},[481,482,483,484,485,486,487,488,489],{"id":15,"depth":156,"text":16},{"id":66,"depth":156,"text":67},{"id":121,"depth":156,"text":122},{"id":125,"depth":156,"text":126},{"id":185,"depth":156,"text":186},{"id":238,"depth":156,"text":239},{"id":270,"depth":156,"text":271},{"id":368,"depth":156,"text":369},{"id":419,"depth":156,"text":420},null,"SIGSEGV","2026-08-05 09:48:28","Пошаговое руководство по устранению сегментации аварии (SIGSEGV) в программах на C под Linux. Узнайте, как быстро найти и исправить причину сбоя с помощью GDB, Valgrind, AddressSanitizer и исправления кода.","medium",false,"5-10 мин","md",[499,502,505,508],{"question":500,"answer":501},"Что означает segmentation fault при запуске программы на C?","Это сигнал SIGSEGV, означающий, что программа попыталась прочитать или записать память, которая не принадлежит ей (например, использовать нулевой указатель, выйти за границы массива).",{"question":503,"answer":504},"Как быстро воспроизвести segfault для отладки?","Запустите программу с помощью GDB: `gdb ./a.out`, затем `run`. Используйте команду `backtrace`, чтобы увидеть место сбоя.",{"question":506,"answer":507},"Можно ли обнаружить segfault без ручного отладчика?","Да, скомпилируйте программу с помощью `-fsanitize=address` (AddressSanitizer) или запустите её под Valgrind — оба инструмента укажут на ошибочные операции с памятью.",{"question":509,"answer":510},"Как предотвратить segfault в продакшн-коде?","Проводите статический анализ кода, используйте безопасные функции (например, strnlen), проверяйте указатели перед использованием и тестируйте программу с инструментами обнаружения ошибок перед релизом.",[512,515,518,521,524],{"name":513,"text":514},"Запустить программу с GDB","Откройте терминал, перейдите к каталогу проекта и выполните `gdb ./a.out`. Затем введите `run`, чтобы запустить программу. Если она упадёт, введите `backtrace`, чтобы получить трассировку стека.",{"name":516,"text":517},"Использовать AddressSanitizer при компиляции","Скомпилируйте программу с помощью `gcc -fsanitize=address -g -O0 main.c -o prog`. Запустите `=./prog`. ASan выведет подробный отчёт о недопустимом доступе к памяти.",{"name":519,"text":520},"Запустить программу под Valgrind","Выполните `valgrind ./prog`. Valgrind покажет номер строки и функцию, где произошло нарушение правил доступа к памяти.",{"name":522,"text":523},"Исправить обнаруженную ошибку","На основе сообщений отладчика исправьте код: проверьте указатели на NULL, убедитесь, что индексы массивов находятся в допустимых пределах, выделите достаточно памяти и освободите её.",{"name":525,"text":526},"Пересобрать и протестировать","Снова скомпилируйте программу (`gcc main.c -o prog`). Запустите её без инструментов отладки, чтобы убедиться, что сбой устранён.","PT10M",[529,530,531,532,533],"сегментация авария C","SIGSEGV ошибка","как исправить segfault Linux","отладка C программа","поиск причины сбоя с помощью gdb","ru_RU",{},true,"/errors/linux/segfault-c","linux",[540,541],"/errors/linux/segfault-python","/guides/linux/debugging","Ошибки Linux",{"title":5,"description":493},"high","errors/linux/segfault-c","Segfault (SIGSEGV) означает, что программа попыталась обратиться к недопустимой области памяти. Эта статья объясняет, почему это происходит, как отладить проблему с помощью инструментов командной строки и как исправить типичные ошибки, которые вызывают сбой.",[548,549,550,551,552,553,554],"Linux","C","отладка","segmentation fault","GDB","Valgrind","AddressSanitizer","error","bY4UTaV-su5zC0Q6OGsJKj4DLdUaRt8pppKvsQNYwdY",{"data":558,"body":559},{},{"type":560,"children":561},"root",[562],{"type":563,"tag":18,"props":564,"children":565},"element",{},[566],{"type":51,"value":501},{"data":568,"body":569},{},{"type":560,"children":570},[571],{"type":563,"tag":18,"props":572,"children":573},{},[574,576,582,584,589,591,596],{"type":51,"value":575},"Запустите программу с помощью GDB: ",{"type":563,"tag":29,"props":577,"children":579},{"className":578},[],[580],{"type":51,"value":581},"gdb ./a.out",{"type":51,"value":583},", затем ",{"type":563,"tag":29,"props":585,"children":587},{"className":586},[],[588],{"type":51,"value":159},{"type":51,"value":590},". Используйте команду ",{"type":563,"tag":29,"props":592,"children":594},{"className":593},[],[595],{"type":51,"value":174},{"type":51,"value":597},", чтобы увидеть место сбоя.",{"data":599,"body":600},{},{"type":560,"children":601},[602],{"type":563,"tag":18,"props":603,"children":604},{},[605,607,612],{"type":51,"value":606},"Да, скомпилируйте программу с помощью ",{"type":563,"tag":29,"props":608,"children":610},{"className":609},[],[611],{"type":51,"value":446},{"type":51,"value":613}," (AddressSanitizer) или запустите её под Valgrind — оба инструмента укажут на ошибочные операции с памятью.",{"data":615,"body":616},{},{"type":560,"children":617},[618],{"type":563,"tag":18,"props":619,"children":620},{},[621],{"type":51,"value":510},{"data":623,"body":624},{},{"type":560,"children":625},[626],{"type":563,"tag":18,"props":627,"children":628},{},[629,631,636,638,643,645,650],{"type":51,"value":630},"Откройте терминал, перейдите к каталогу проекта и выполните ",{"type":563,"tag":29,"props":632,"children":634},{"className":633},[],[635],{"type":51,"value":581},{"type":51,"value":637},". Затем введите ",{"type":563,"tag":29,"props":639,"children":641},{"className":640},[],[642],{"type":51,"value":159},{"type":51,"value":644},", чтобы запустить программу. Если она упадёт, введите ",{"type":563,"tag":29,"props":646,"children":648},{"className":647},[],[649],{"type":51,"value":174},{"type":51,"value":651},", чтобы получить трассировку стека.",{"data":653,"body":654},{},{"type":560,"children":655},[656],{"type":563,"tag":18,"props":657,"children":658},{},[659,661,667,669,675],{"type":51,"value":660},"Скомпилируйте программу с помощью ",{"type":563,"tag":29,"props":662,"children":664},{"className":663},[],[665],{"type":51,"value":666},"gcc -fsanitize=address -g -O0 main.c -o prog",{"type":51,"value":668},". Запустите ",{"type":563,"tag":29,"props":670,"children":672},{"className":671},[],[673],{"type":51,"value":674},"=./prog",{"type":51,"value":676},". ASan выведет подробный отчёт о недопустимом доступе к памяти.",{"data":678,"body":679},{},{"type":560,"children":680},[681],{"type":563,"tag":18,"props":682,"children":683},{},[684,686,692],{"type":51,"value":685},"Выполните ",{"type":563,"tag":29,"props":687,"children":689},{"className":688},[],[690],{"type":51,"value":691},"valgrind ./prog",{"type":51,"value":693},". Valgrind покажет номер строки и функцию, где произошло нарушение правил доступа к памяти.",{"data":695,"body":696},{},{"type":560,"children":697},[698],{"type":563,"tag":18,"props":699,"children":700},{},[701],{"type":51,"value":523},{"data":703,"body":704},{},{"type":560,"children":705},[706],{"type":563,"tag":18,"props":707,"children":708},{},[709,711,717],{"type":51,"value":710},"Снова скомпилируйте программу (",{"type":563,"tag":29,"props":712,"children":714},{"className":713},[],[715],{"type":51,"value":716},"gcc main.c -o prog",{"type":51,"value":718},"). Запустите её без инструментов отладки, чтобы убедиться, что сбой устранён.",[]]