【发布时间】:2014-06-26 03:11:27
【问题描述】:
鉴于:
char *message = "Hello, World";
char *format = "x=%i\n";
int x = 10;
为什么printf (message); 无效(即编译器因可能不安全而拒绝)而printf (format, x); 无效?
在这种情况下,format 是否被视为字符串文字,message 是否被视为格式字符串?如果有,为什么?
更新
我知道为什么
printf (message); 被拒绝了。我的问题是,为什么printf (format, x); 也没有被拒绝。
我正在使用clang。 printf (message); 的错误消息是 format string is not string literal (potentially insecure)。
它在 gcc 下编译得很好。所以它似乎是特定于编译器的,并且与 clang 如何设置警告有关。
【问题讨论】:
-
您收到的实际错误消息是什么,您使用的是什么编译器?这些是至关重要的信息。
-
什么编译器?它究竟是如何被拒绝的?
-
最好发布完整的代码。编译器可能会看到
format只使用一次并优化了printf (format, x),这样它就知道format不会改变,即使声明了char *format。可能编译器看到了message值的潜力,这取决于其他代码。因此存在安全风险。存在其他可能性,但查看完整代码会有所帮助。 -
@chux 我并不是指一个具体的例子。两个字符串指针按照上面的定义一起定义和初始化。在代码的两个单独编译中,我只是对每个使用
printf (),仅此而已。 -
在那种情况下,我会选择@this answer。