Не получая ошибку сегментации, ожидая этого - PullRequest
2 голосов
/ 09 июля 2011

Я играю с переполнением буфера, но меня смущает то, что я нахожу при запуске следующей простой программы на C в Mac OS.

#include <stdio.h>

int main(void) {

        char buf[2];

        scanf("%s", buf);

        printf("%s\n", buf);

}

Устанавливая длину buf равной 2байт, я ожидал вызвать ошибку сегментации при вводе строки "CCC", но этого не происходит.Только при вводе строки длиной 24 символа у меня возникает ошибка сегментации.

Что происходит?Это как-то связано с кодировкой символов?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 09 июля 2011

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

Могут быть или не быть некоторые байты заполнения после вашего буфера, которые оказываются неважными для выполнения вашего кода.Вы не можете полагаться на это.Другой компилятор, компилируемый в 32-битной или 64-битной конфигурации, параметры отладки ... все, что может изменить выполнение вашего кода после этого переполнения.

2 голосов
/ 09 июля 2011

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

1 голос
/ 09 июля 2011

buf выделяется в стеке, вы просто перезаписываете область, которая не используется, есть большая вероятность, что никто не будет жаловаться на это. На некоторых платформах ваш код будет принимать целые абзацы.

1 голос
/ 09 июля 2011

Нет никакой гарантии, что вы получите ошибку сегментации вообще.После перезаписи char buf[2] появляется больше данных, которые могут вызывать или не вызывать ошибку сегментации.

1 голос
/ 09 июля 2011

I думаю это связано с разметкой памяти. Если то, что вы перезаписываете, доступно вашему процессу (страница отображается writable), то у ОС нет шансов увидеть, что вы делаете что-то "неправильно".

Действительно, когда делаешь что-то подобное, с точки зрения программиста на Си "это совершенно неправильно!" Но в глазах ОС: «Хорошо, он пишет материал для какой-то страницы. Отображена ли страница с соответствующими правами доступа? Если это так, хорошо».

...