我经常遇到缓冲区溢出的问题。
int y[10][10][10];
...
y[0][15][3] = 8;
我该如何防止这个问题的发生?有没有好用的工具可以帮助我?
我经常遇到缓冲区溢出的问题。
int y[10][10][10];
...
y[0][15][3] = 8;
我该如何防止这个问题的发生?有没有好用的工具可以帮助我?
Neil的回答在一般情况下更好,但如果你有使用普通数组的理由,你可以使用函数来获取和设置值,并检查是否在数组边界内:
#define MAX_INDEX 10
int y[MAX_INDEX][MAX_INDEX][MAX_INDEX];
int get_y(int a, int b, int c)
{
ASSERT(a >= 0 && a < MAX_INDEX);
ASSERT(b >= 0 && b < MAX_INDEX);
ASSERT(c >= 0 && c < MAX_INDEX);
return y[a][b][c];
}
void set_y(int a, int b, int c, int value)
{
ASSERT(a >= 0 && a < MAX_INDEX);
ASSERT(b >= 0 && b < MAX_INDEX);
ASSERT(c >= 0 && c < MAX_INDEX);
y[a][b][c] = value;
}
最好将所有内容都封装在一个类中。
在C++中,一个解决方案是永远不要使用数组,而是使用C++容器。例如,如果您使用at而不是[]进行索引,则向量具有越界检测功能。
在C语言中,您应该始终设计函数,使您提供数组的指针和维数,没有其他方法。
用于检查越界访问的好工具是valgrind。它通过运行未更改的二进制文件来工作,并且如果您使用调试信息编译,则可以给出发生错误的精确行号。Valgrind适用于许多Unix系统,包括Mac OS X。
请注意,valgrind并不总是能够检测到这些错误访问(在您的示例中,假设它是真正的越界访问,则由于变量位于堆栈上而不是堆上,因此valgrind将无法发现它)。