我试图设置此代码以避免缓冲区溢出,但我不确定为什么它不起作用。我对此很陌生,将不胜感激。
我尝试使用断言来确保它结束,但我希望断言成功
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语言本身并不像其他语言一样执行边界检查。这就是使其快速运行的部分原因。这也意味着该语言信任开发人员不要执行超出数组范围的读/写操作。破坏信任会导致undefined behavior。因此,由您来确保不会发生这种情况。
也有诸如valgrind之类的工具,可以帮助识别内存管理不善。