使用MinGW的CodeBlocks中strcpy函数的异常行为

时间:2016-01-25 05:47:12

标签: c mingw codeblocks c-strings strcpy

具有MinGW的CodeBlocks中的

strcpy函数表现不正常。当Destination的空间小于源字符串时,它正在修改常量字符串。根据标准,如果Destination的空间少于源,则行为是未定义的,但为什么Source(S)被strcpy函数接受为常量?是否会被修改?

#include<string.h>
#include<stdio.h>
int main(){
    char S[]="Computer";
    char D[]="";
    strcpy(D,S);
    printf("%s\n",S);
    return 0;
}

输出: When size of D(Destination) is equal or more than size of S(source)

输出: When size of D is less than size of S

输出:Omputer [未指定D的大小时]

2 个答案:

答案 0 :(得分:1)

尝试理解未定义的行为毫无意义。根据定义,行为是&#34;未定义&#34;。

我的猜测是,堆栈帧中为SD分配的内存如下:

| D  |                S                   |
+-- -+---+---+---+---+---+---+---+---+----+
| \0 | C | o | m | p | u | t | e | r | \0 |
+-- -+---+---+---+---+---+---+---+---+----+

当您将D修改为超出有效限制时,您将结束修改S的内容。

虽然这对您的平台来说可能是正确的,但不能保证在另一个平台上也是如此。结论:当标准清楚地表明它是未定义的行为时,不依赖于特定的行为。

答案 1 :(得分:0)

事实上,通过选择S&gt; D,你是如此接近创建一个缓冲区溢出。在strcpy(3) man page in my system (FreeBSD 10.2-RELEASE)中,有以下注释

SECURITY CONSIDERATIONS
     The strcpy() function is easily misused in a manner which enables mali-
     cious users to arbitrarily change a running program's functionality
     through a buffer overflow attack.

C不进行任何边界检查,并期望程序员这样做。您可能会或可能不会覆盖其他缓冲区,完全取决于您的编译器实现。

正如评论和其他帖子中所述,您不能指望未定义行为遵循定义的模式。