如何避免C中的缓冲区溢出

时间:2019-03-30 00:31:18

标签: c buffer overflow

我试图设置此代码以避免缓冲区溢出,但我不确定为什么它不起作用。我对此很陌生,将不胜感激。

我尝试使用assert来确保它结束,但是我希望assert能够成功

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

期望断言通过,但失败。想要修复它而不完全重写循环。谢谢!

2 个答案:

答案 0 :(得分:1)

assert的确切功能上似乎存在一些误解。 assert宏对给定条件执行运行时检查。如果该条件为假,则会导致程序中止。

在这种情况下,i的值在循环内的范围是0到15。在i的值小于8的迭代中,断言通过。但是一旦i变为8,则断言失败,导致程序中止。失败的断言不会导致程序例如跳过下一个循环迭代。

处理此问题的正确方法是限制循环计数器不超出范围:

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

C语言本身并不像其他语言一样执行边界检查。这就是使其快速运行的部分原因。这也意味着该语言信任开发人员不要执行超出数组范围的读/写操作。打破信任关系将产生undefined behavior。因此,由您确保不会发生这种情况。

还有诸如valgrind之类的工具,可帮助识别内存管理不善。

答案 1 :(得分:0)

插入失败,按预期方式。将计数器限制更改为8即可通过。

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

但是也许你真的想要

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