[英]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.