C语言中未用const限定符时printf打印字符串为何触发警告?
问题背景
以下代码使用gcc -Wformat -Wformat-security编译时无警告:
#include<stdio.h> int main() { const char arr[10] = "hello"; printf(arr); return 0; }
但移除const char arr[10]中的const后,编译会触发如下警告:
<source>: In function 'main': <source>:5:10: warning: format not a string literal and no format arguments [-Wformat-security] 5 | printf(arr); |
原因解析
GCC的-Wformat-security警告核心是防范格式化字符串漏洞:如果传给printf的第一个参数是可修改的字符串,存在被注入%n这类危险格式化符、进而篡改内存的风险。
当你给数组加上const后,编译器会判定arr是只读的常量字符串——它的内容在程序运行全程不会被修改,完全不存在被恶意篡改的可能,所以编译器认为这个调用是安全的,不会触发警告。
而去掉const后,arr变成了可修改的字符数组,编译器无法确保它的内容始终安全(比如后续代码可能修改数组内容,或者数组数据来自不可信输入),因此会触发警告,提示你改用更安全的写法,比如printf("%s", arr);。
简单说,const在这里就是给编译器递了个“这个字符串不会变,绝对安全”的信号,让编译器跳过安全警告。
内容的提问来源于stack exchange,提问作者Baranitharan
相关产品推荐
相关产品推荐

