Превышать размер буфера? - PullRequest
       31

Превышать размер буфера?

1 голос
/ 09 октября 2011

Почему возможно превышение размера буфера в C до определенного предела без какой-либо ошибки (ошибка сегментации)?

Например, я играл с этим кодом:

#include <stdio.h>
#include <string.h>

void function1(char *a) {
   char buf[10];
   strcpy(buf, a);
   printf("End of function1\n");
}

main (int argc, char *argv[]) {
   function1(argv[1]);
   printf("End of main\n");
}

Я смог передать в качестве аргумента до 23 символов вместо 10 символов без ошибок, но когда я использую 24 символа, я получаю ошибку сегментации.

Я знаю, что с 24-м символом я нажимаювозвращаемое значение.Но как быть с предыдущими 13 ?? !!

Ответы [ 2 ]

3 голосов
/ 09 октября 2011

Вы получили ошибку. Вы превысили размер буфера, и ничего страшного не произошло. Наивно, когда вы превышаете буфер, должно произойти что-то ужасное. То, что вы ожидали, не произошло, определение ошибки.

Я не пытаюсь быть легкомысленным. Моя точка зрения серьезна: если вы нарушаете правила, вы не представляете, что произойдет. Вы можете получить ошибку. Это может показаться хорошо. Что-то еще может случиться. В принципе, это непредсказуемо. Он может измениться с компилятора на компилятор, операционную систему на операционную систему или даже работать для запуска.

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

1 голос
/ 09 октября 2011

В этом прелесть неопределенного поведения .

  • Для C запись вне массива недопустима
  • Для вашей операционной системы запись по не отображенному адресуили по адресу, сопоставленному с неправильными разрешениями (только для чтения), недопустимо

Эти представления о том, что разрешено делать процессу, не всегда идеально совпадают.

Это вполне возможнодля программы на C, которая делает что-то полностью поврежденное мозгом, что заставляет ОС говорить «все в порядке со мной», потому что это неотличимо от нормальной работы.

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

...