Eclipse C字符串不会溢出

问题描述

在我了解C的同时,我正在为C / C ++开发人员使用Eclipse IDE。从理论上讲,当我输入的字符串大于分配的字符串大小时,应该以某种方式发生溢出。但这一切都很好,我看不到预期的麻烦。

AB

我想故意看到溢出的情况,但我没有。例如,运行时,如果我键入Wolfeschlegelsteinhausenbergerdorff,它将正确输出,而在Eclipse中不会出现任何与溢出相关的消息。我不知道它是C还是Eclipse的功能。有谁知道为什么超大尺寸还可以吗?

解决方法

此示例仅很好地说明了为什么重要的是要利用您可以使用的工具来捕获常见的编程错误。像这样的阵列溢出可能多年无法发现,直到有人将其用作利用的基础。容易犯此类错误-它们通常不如OP中的错误那么明显-并且在测试时不一定会导致失败。

现代C编译器可防止在堆栈末尾写入数组的情况。他们无法使代码正常工作,但是它们可以表示故障,因此可以跟踪故障。例如,如果我使用gcc-fstack-protector来构建OP的代码,那么即使是很小的溢出也会立即导致失败:

Type name: 12345678987654321
You are 12345678987654321.
*** stack smashing detected ***: <unknown> terminated

与调试器结合使用,可以很快地检测到问题代码。

如果您的编译器不提供此类检查,请使用更好的编译器;)

,

正如@retiredninja在评论中提到的那样,缓冲区溢出会导致未定义的行为,因此您无法期望会发生任何事情。

可以说,要观察一些简单的缓冲区溢出,可以尝试以下方法:

#include <stdio.h>

int main()
{
    char overflow[16];
    char nameArr[16];
    overflow[15] = '\0';
    nameArr[15] = '\0';
    printf("Type name: ");
    scanf("%s",nameArr);
    printf("You are %s.\n",nameArr);
    printf("overflow: %s\n",overflow);

    return(0);
}

当我用

编译时
gcc -Wall -W main.c -o main -fno-stack-protector -O0

运行它,我明白了

$ ./main
Type name: 123456789abcdefghijklmnopqrstuvwxyz
You are 123456789abcdefghijklmnopqrstuvwxyz.
overflow: hijklmnopqrstuvwxyz

表示多余的文本被写入与预期变量相邻的内存中。在这里顺序很重要:这些变量存在于堆栈中,该堆栈在内存中向下增长,因此“在”变量之后的内存属于在其之前声明的变量。

请注意,我回答的所有内容都取决于实现,因此不能期望所有编译器,OS等都发生这种情况。尤其如此,因为我们正在谈论未定义的行为。