向格式化函数传递了错误类型的参数¶
ID: cpp/wrong-type-format-argument
Kind: problem
Security severity: 7.5
Severity: error
Precision: high
Tags:
- reliability
- correctness
- security
- external/cwe/cwe-686
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
对 printf
函数或相关函数的每次调用都应包含格式定义的参数类型和顺序。如果传递给函数的参数类型或顺序不同,则会重新解释参数以符合预期的类型和顺序,从而导致不可预测的行为。
建议¶
查看突出显示的函数调用预期的格式和参数。更新格式或参数,以便将预期类型和顺序的参数传递给函数。
示例¶
在以下示例中,为整数格式参数指定了错误的格式说明符
int main() {
printf("%s\n", 42); // BAD: printf will treat 42 as a char*, will most likely segfault
return 0;
}
更正后的版本使用 %i
作为整数格式参数的格式说明符
int main() {
printf("%i\n", 42); // GOOD: printf will treat 42 as an int
return 0;
}
参考¶
Microsoft Learn:格式规范语法:printf 和 wprintf 函数。
CERT C 编码标准:FIO47-C. 使用有效的格式字符串。
常见缺陷枚举:CWE-686。