繁体   English   中英

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

[英]How to avoid buffer overflow in c

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

我试过使用断言来确保它结束,但我希望断言成功

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

期望断言通过但失败。 想要在不完全重写循环的情况下修复它。 谢谢!

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

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

处理这个问题的正确方法是限制循环计数器不越界:

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

C 语言本身不像其他一些语言那样执行边界检查。 这是使它快速的部分原因。 这也意味着该语言相信开发人员不会做诸如超出数组范围的读/写之类的事情。 破坏这种信任会导致未定义的行为 因此,您需要确保不会发生这种情况。

还有一些工具,例如 valgrind,可以帮助识别内存管理不善。

断言按预期失败。 将计数器限制更改为 8 以通过。

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

但也许你真的想要

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM