Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 防止C/C+中的缓冲区溢出+;_C++_C_Buffer Overflow - Fatal编程技术网

C++ 防止C/C+中的缓冲区溢出+;

C++ 防止C/C+中的缓冲区溢出+;,c++,c,buffer-overflow,C++,C,Buffer Overflow,很多时候我都会遇到缓冲区溢出的问题 int y[10][10][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 &&

很多时候我都会遇到缓冲区溢出的问题

int y[10][10][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;
}
#定义最大索引10
int y[MAX_INDEX][MAX_INDEX][MAX_INDEX];
int get_y(int a、int b、int c)
{
断言(a>=0&&a=0&&b=0&&c=0&&a=0&&b=0&&c

…理想情况下,都封装在一个类中。

不要使用原始的C样式数组。相反,使用C++容器类,如STD::vector,它有能力检查无效访问并在发生异常时引发异常。
此外,您所描述的并不是真正的缓冲区溢出。

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

代码级别的解决方案 在C++中,一个解决方案是永远不要使用数组,而是C++容器。例如,如果在[]的整数处使用索引,则向量具有越界检测

在C语言中,你应该总是设计你的函数,比如你给数组的指针和维度,这是没有办法的

工具级别的解决方案 valgrind是检查越界访问的一个很好的工具。它的工作原理是不改变地运行二进制文件,如果使用调试信息进行编译,它可以给出错误发生的精确行。Valgrind可以在许多unix上工作,包括MacOSX


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

在跟踪宏中使用sprintf是最大的罪恶

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

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

我用Visual C++ 2008实现了它,效果很好。我可以在多维数组中发现缓冲区溢出,比如
inty[10][10][10]

你认为它是跨平台的吗


你对它了解得更多吗?

如果你下定决心使用哪种语言,你会得到更好的答案。C和C++是非常不同的语言,我希望我能编辑评论…当然应该是“你的头脑”。@avakar:删除你的评论并重新添加。你的例子中没有溢出。10x10x10=1000,因此您有一个1000整数的数组。索引[0 ] [15 ] [3 ]是15×10 +(3 +1)=第一百五十四int,所以你在界限之内。我使用C和C++。问题出在示例中的原始C数组上。ù您是对的,它不是整个多维数组上的缓冲区溢出,但是如果我将数组定义为10x10x10,我不想遍历数组的单个维度。谢天谢地,RegardsValgrind甚至在堆上也找不到这个,因为访问是在整个数组中进行的(正如@qrdl在他对问题的评论中指出的)。这就是“假设它是真正的越界访问”的意思。很多时候,我为只允许原始数组的嵌入式系统编写代码。多亏了吹毛求疵,ASSERT不会像您在嵌入式系统中期望的那样工作(除非您专门为它们编写了代码)。但我大体上同意
#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;
}