带有 MinGW 的 CodeBlocks 中 strcpy 函数的异常行为

Abnormal behaviour of strcpy function in CodeBlocks with MinGW

带有 MinGW 的 CodeBlocks 中的 strcpy 函数运行不正常。当 Destination 比源字符串少 space 时,它正在修改常量字符串。根据标准,如果 Destination 比 source 少 space,则行为未定义,但为什么被 strcpy 函数接受为常量的 Source(S) 会被修改?

#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

输出:计算机 [未指定 D 的大小时]

试图理解未定义的行为是没有意义的。根据定义,行为是 "undefined".

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

| D  |                S                   |
+-- -+---+---+---+---+---+---+---+---+----+
| [=10=] | C | o | m | p | u | t | e | r | [=10=] |
+-- -+---+---+---+---+---+---+---+---+----+

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

虽然这可能适用于您的平台,但不能保证在其他平台上也是如此。底线:当标准明确指出它是未定义的行为时,不要指望特定行为

事实上,通过选择 S > 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 不做任何边界检查,希望程序员这样做。您可能会或可能不会覆盖其他缓冲区,这完全取决于您的编译器实现。

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