带有 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".
我的猜测是栈帧中为S
和D
分配的内存如下:
| 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 不做任何边界检查,希望程序员这样做。您可能会或可能不会覆盖其他缓冲区,这完全取决于您的编译器实现。
如评论和其他帖子中所述,您不能指望未定义的行为遵循定义的模式。
带有 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".
我的猜测是栈帧中为S
和D
分配的内存如下:
| 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 不做任何边界检查,希望程序员这样做。您可能会或可能不会覆盖其他缓冲区,这完全取决于您的编译器实现。
如评论和其他帖子中所述,您不能指望未定义的行为遵循定义的模式。