如何修复“format not a string literal and no format arguments”编译错误
问题修复方案
报错原因
-Wformat-security 编译选项会拦截所有将非字面量字符串直接作为格式化类函数(此处的panic属于这类函数)首个格式参数的写法。这种写法存在安全风险:如果info指向的字符串包含%s、%d等格式化占位符,panic会错误读取栈上的额外内存,轻则触发崩溃,重则存在格式化注入攻击风险。
修复方法
将原动态传入格式串的写法调整为固定字面量格式串,把要输出的内容作为格式化参数传递即可,修改后的代码如下:
panic("%s", info == NULL ? "AcpiOsSignal: fatal" : (const char*)info);
该修改完全保留原有逻辑,没有额外性能开销,同时符合编译安全要求。
内容的提问来源于stack exchange,提问作者Alan Shearer
相关产品推荐
相关产品推荐

