很多时候我遇到缓冲区溢出问题。
int y[10][10][10];
...
y[0][15][3] = 8;
如何防止此问题? 有什么好的工具可以帮助我吗?
答案 0 :(得分:10)
在一般情况下,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;
}
......理想情况下,所有这些都包含在课堂上。
答案 1 :(得分:9)
不要使用原始C风格的数组。相反,使用诸如std :: vector之类的C ++容器类,它们能够检查无效访问并在异常访问发生时引发异常。
此外,您所描述的并不是真正的缓冲区溢出。
答案 2 :(得分:1)
除了其他评论之外,您还可以查看此主题中有关静态代码分析工具的建议:
答案 3 :(得分:1)
在C ++中,一种解决方案是永远不使用数组,而是使用C ++容器。例如,如果在[]的intead处使用索引
,则向量具有越界检测在C中,你应该总是设计你的函数,比如你给出指针和数组的维度,没有办法解决它。
检查越界访问的一个很棒的工具是valgrind。它的工作方式是不加改变地运行二进制文件,如果使用调试信息进行编译,则可以给出出现错误的精确行。 Valgrind在许多unix上工作,包括mac os x。
请注意,valgrind无法始终检测到这些错误的访问(在您的示例中,假设它是一个真正的越界访问,它会被valgrind忽略,因为变量在堆栈上,而不在堆上)。
答案 4 :(得分:0)
我找到了一个有趣的缓冲区溢出软件。 您可以从www.bugfighter-soft.com免费下载
它说它可以发现缓冲区溢出,并且它独立于编译器和平台。
我尝试使用Visual C ++ Express 2008并且运行良好。我可以发现多维数组中的缓冲区溢出,例如int y[10][10][10];
你认为它是跨平台的吗?
你对此有更多了解吗?
答案 5 :(得分:-1)