Как избежать переполнения буфера в c - PullRequest
0 голосов
/ 30 марта 2019

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

Я пытался использовать assert, чтобы убедиться, что он заканчивается, но я хочу, чтобы assert завершился успешно

void authenticate (void) 
{
    char buffer1[8];
    int i;
    for (i = 0; i < 16; i++)
    {
        assert (i < sizeof(buffer1));
        buffer1[i] = ‘x’;
    }
}

ожидаем, что утверждение прошло, но это не удалось. Хотите исправить это, не переписывая цикл полностью. Спасибо!

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Здесь, кажется, есть некоторое недопонимание, как именно assert функционирует.Макрос assert выполняет проверку заданного условия во время выполнения.Если это условие ложно, это приводит к прерыванию программы.

В этом случае значение i находится в диапазоне от 0 до 15 внутри цикла.На итерациях, где значение i меньше 8, утверждение проходит.Но как только i становится 8, утверждение не выполняется, что приводит к прерыванию программы.Неудачное утверждение не приведет к тому, что программа, например, пропустит следующую итерацию цикла.

Правильный способ справиться с этим - ограничить счетчик цикла, чтобы он не выходил за пределы:

for (i=0; i<sizeof(buf); i++)

Язык C сам по себе не выполняет проверку границ, как некоторые другие языки.Это часть того, что делает это быстро.Это также означает, что язык доверяет разработчику не делать такие вещи, как чтение / запись вне границ массива.Разрушение этого доверия приводит к неопределенному поведению .Поэтому вам нужно убедиться, что этого не произойдет.

Есть также инструменты, такие как valgrind, которые помогут выявить неправильное управление памятью.

0 голосов
/ 30 марта 2019

Утверждение не выполняется, как ожидалось. Измените предел счетчика на 8, чтобы пройти.

    for (i = 0; i < 8; i++)

Но, может быть, вы действительно хотите

    buf[7]=0;
    for (i = 0; i < 8; i++)
...