我是(快速)写一些代码的时候,突然倒在参数scanf()
:
char i[] = "ABC1\t";
scanf(i, "%s");
与编译gcc -Werror -Wall -Wextra
不抱怨这一位。 显然,这个代码不工作,但为什么没有gcc的告诉我,我倒的论点? 不能把它检测到i
是不是一个格式字符串,或者第二个参数是不是实体店,能型?
编辑
感谢您的洞察力所有,看起来像我找到了答案,有上扭转-Wformat
标志,使这个“开捕”(下面贴以供参考)
哈! 我找到了。 击中与海湾合作委员会-Wformat=2
标志抓住它。
发帖对他人的参考信息:
下面是我发现的标记的列表
-Wformat Check calls to printf and scanf, etc., to make sure that the arguments supplied have types appropriate to the format string specified...
我曾以为-Wall
有-Wformat
于它,这确实如此,但什么我刚刚发现了非常重要的组成部分:
-Wformat is included in -Wall. For more control over some aspects of format checking, the options -Wformat-y2k, -Wno-format-extra-args, -Wno-format-zero-length, -Wformat-nonliteral, -Wformat-security, and -Wformat=2 are available, but are not included in -Wall.
我想这不应该。
int scanf ( const char * format, ... );
i
已正常转换为const char*
,其余参数都只是“省略号”,不能在编译时进行检查。
对于scanf函数(scanf的人)手工录入给出原型:
int scanf(const char *format, ...);
一个char []是一种特殊类型char *的,所以第一个参数是满意的。 二级参数在运行时进行评估(如果我记得),所以他们甚至没有被这里的编译器考虑。 从编译器的预期,这是一个很好的呼吁给予其原型的功能。
此外,编译器永远不会检查你是否尝试写入无效的位置。 关于C伟大(或可怕的)事情是,它可以让你做或多或少你想要的东西,即使你想要的是一个坏主意。