【发布时间】:2011-07-02 02:25:36
【问题描述】:
所以我在一些 c 代码上运行了一些静态代码分析器,让我感到惊讶的是一个警告:
int val;
scanf("%d", &val);
这表示对于足够大的输入,这可能会导致段错误。毫无疑问,这确实会发生。现在修复很简单(指定一些宽度;毕竟我们知道一个有效整数最多可以有多少个位置,具体取决于架构)但我想知道的是为什么会发生这种情况以及为什么会这样'不被视为 libc 中的一个错误(并且是一个简单的修复)?
现在我假设我首先错过了这种行为的某些原因?
编辑:好的,因为这个问题似乎不是那么明确,多一点解释: 不,代码分析器一般不会对 scanf 发出警告,但会在 scanf 读取没有特定宽度的数字时发出警告。
所以这是一个最小的工作示例:
#include <stdlib.h>
#include <stdio.h>
int main() {
int val;
scanf("%d", &val);
printf("Number not large enough.\n");
return 0;
}
我们可以通过发送一个巨大的数字来获得一个段错误(使用例如 Python):
import subprocess
cmd = "./test"
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, shell=True)
p.communicate("9"*50000000000000)
# program will segfault, if not make number larger
【问题讨论】:
-
你的静态代码分析器是窥视
scanf格式字符串还是只是盲目地抱怨scanf? -
你到底用的是哪个程序?