В главе 1.9 классической книги Брайана и Денниса о языке C "Язык программирования C" есть кусок кода о функции getline, которая используется для копирования следующей строки входного текста в строку типа char. и проверьте перелив. Я цитирую код ниже:
int getline(char line[], int maxline);
int getline(char s[], int limit)
{
int c,i;
for (i=0; i<limit-1 && (c=getchar())!=EOF && c!='\n'; ++i) /* ** */
s[i]=c;
if (c == '\n') {
s[i]=c;
++i;
}
s[i] = '\0';
return i;
}
Вот проблема: параметр limit — это максимальная длина строки, поэтому массив s[] может содержать только набор элементов от s[0] до s[limit-1]. Если последним символом переменной c для getchar() является '\n', а индекс этого символа равен limit-1, то часть оценки в цикле for не будет выполнена из-за 'i==limit-1', но не 'c!='\n' (в порядке слева направо). Далее, если предложение будет работать из-за 'c=='\n'', тогда s[limit-1]=c, тогда ++i установит значение i в limit. s[i]='\0' будет переполнено, потому что s[limit] превышает лимит строки. Верен ли мой анализ или нет? Спасибо за любые полезные ответы.
i
достиглоlimit-1
. Короткий логический eval разорвет цикл доgetchar()
и последующего присваивания и дальнейшего сравнения. - person WhozCraig   schedule 08.08.2014