以下(损坏的)示例代码 scanf 将输入字符串转换为整数,但允许将空字符串转换为 0:
#include <stdio.h>
#include <string.h>
int parse(const char *p)
{
int value; // whoops! forgot to 0 here.
if (*p && sscanf(p, "%d", &value) != 1)
return -1;
return value;
}
int main(int argc, char **argv)
{
const char *p = argc > 1 ? argv[1] : "";
int value = parse(p);
printf("value = %d\n", value);
}
但它使用 -Wall 编译干净。
https://godbolt.org/z/sPbx99Ms5
但由于明显问题而失败:
$ ./test 123
value = 123
$ ./test xxx
value = -1
$ ./test ""
value = 32765
我意识到很难确定 scanf 可能 不会像它那样填充值 看不到代码,但是否有标志或扫描仪可以在(大型)代码体上运行以尝试查找是否存在指针传递未初始化变量的地方?
...即使是能找到所有未初始化变量的东西也会很有用。