【发布时间】:2010-07-21 20:12:40
【问题描述】:
为什么 ANSI C 编译器不标记在相应参数没有 const 限定符的函数调用中使用字符串字面量参数?例如,以下代码可能会通过尝试写入只读内存来生成异常。
void somefunc(char buffer[10]);
void somefunc(char buffer[10]) {
int i;
for (i = 0; i < 10; i++)
buffer[i] = 0;
}
int main(int argc, char **argv) {
somefunc("Literal");
return 0;
}
这种情况可以在编译时确定,但 VS2010 和 gcc 似乎没有这样做。使用 const char* 参数调用 somefunc 将生成编译器警告。
【问题讨论】:
-
好问题 - gcc 也没有捕捉到这一点,即使是
-Wextra。 -
声明一个函数,然后在下一行定义它的意义何在? :)
-
Hans:我已经修改了问题以指定 ANSI C。无论如何,我并不是建议发出编译器错误。 3 级或 4 级警告只会突出潜在的危险情况。
-
附注:
main的参数是倒置的,正确的签名是int main(int argc, char *argv[])。 -
只是为了澄清-我的问题不是“为什么不将字符串文字视为 const char*?”但是“为什么我们在使用字符串文字参数调用 somefunc() 时不会收到编译器警告?”正如 lunaryorn 指出的那样,函数签名为编译器提供了足够的信息来发出此警告。
标签: c