3

很多时候我遇到缓冲区溢出问题。

int y[10][10][10];

...

y[0][15][3] = 8;

我怎样才能防止这个问题?有什么好的工具可以帮助我吗?

4

6 回答 6

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;
}

...理想情况下,所有课程都在上课。

于 2009-07-05T11:39:35.147 回答
10

不要使用原始 C 风格的数组。相反,使用 C++ 容器类,例如 std::vector,它们能够检查无效访问并在发生异常时引发异常。

此外,您所描述的并不是真正的缓冲区溢出。

于 2009-07-05T11:39:35.693 回答
1

除了其他评论之外,您还可以查看此线程中的建议,该线程涉及静态代码分析工具:

C/C++ 免费替代 Lint?

于 2009-07-05T11:50:06.517 回答
1

代码层面的解决方案

在 C++ 中,一种解决方案是从不使用数组,而是使用 C++ 容器。例如,如果您使用 at intead of [] 进行索引,则向量具有越界检测

在 C 中,您应该始终设计函数,例如给出数组的指针和维度,这是没有办法的。

工具级别的解决方案

检查越界访问的一个很好的工具是 valgrind。它通过运行未更改的二进制文件来工作,并且如果您使用调试信息进行编译,它可以给出发生错误的精确行。Valgrind 在许多 unix 上工作,包括 mac os x。

请注意,valgrind 不能总是检测到那些错误的访问(在您的示例中,假设它是一个真正的越界访问,它会被 valgrind 忽略,因为变量在堆栈上,而不是在堆上)。

于 2009-07-05T12:10:49.407 回答
0

我发现了一个有趣的缓冲区溢出软件。您可以从 www.bugfighter-soft.com 免费下载它

它说它可以发现缓冲区溢出并且它独立于编译器和平台。

我用 Visual C++ Express 2008 试了一下,效果很好。我可以在多维数组中发现缓冲区溢出,例如int y[10][10][10];

你认为它是跨平台的吗?

你知道更多吗?

于 2009-07-14T22:51:42.650 回答
-1

在 TRACE MACROS 中使用 sprintf 是最大的罪恶

于 2009-07-06T11:51:23.643 回答