【发布时间】:2018-11-23 12:43:32
【问题描述】:
我有以下代码:
_Bool grantAccess(char *password){
char goodPassWord[]= "goodpass";
return (0 == strcmp(password, goodPassWord));
}
_Bool grantAccessExercise(void){
char password[9];
int allow = 0;
printf("Please enter password: ");
gets(password);
if (grantAccess(password)) {
allow = 1;
}
return (allow != 0);
}
当我输入 10 个字符的任意组合作为密码时,它会溢出并覆盖空终止符。谁能解释为什么非空终止值导致 StrCmp 返回 0?
【问题讨论】:
-
这是未定义的行为,因此无法保证
0的结果。它还不如完全做其他事情。 -
请注意,dangerous 函数
gets不会“覆盖空终止符”,而是写入数组的空终止符越界 . -
仅仅因为某些东西似乎有效并不意味着行为实际上是定义的,只是你碰巧是“幸运的”(有些人会认为它un幸运)。你不知道它什么时候会坏掉,也不知道一旦它发生你做了什么让它坏掉。
-
@Hughes_J 请注意,您需要区分 '实现定义的行为',这意味着该行为不是由标准定义的,而是留给编译器供应商(然后需要记录它们各自的实现如何表现)和 'undefined behavior' 这意味着不存在任何正确的行为,无论你做什么,结果都不正确(例如计算实数平方根从负实数值)。
标签: c buffer-overflow strcmp