我已经在大型C / C ++代码库中更新了printf样式格式字符串的内容和参数。代码编译好,但实际上很难得到这些错误并验证我的更改是否正确。
是否有工具/编译器选项可以验证格式字符串是否具有正确的编号。论点。如果它不尝试编译整个事情会很好,因为依赖关系等必须存在于预期的位置。
我可以写一个快速的脚本,但我可以重用已经存在的东西并处理角落案例。
类似的东西: -
% cat test.c
#include <iostream>
#include "dependency2.h"
int main()
{
function2(log, "You encountered a common error %s: %d", error)
}
% somenicetool test.c
5: too few arguments
我试过clang,但它给出的第一个错误是: -
% clang -fsyntax-only test.c
#include "dependency2.h"
^
file not found
1 error generated
答案 0 :(得分:6)
如果使用gcc
和--Wformat
,并且您拥有自己的功能,则需要在功能后使用__attribute__(format, printf, format_argno, first_var_arg)
。
例如:
void log_print(FILE *logfile, int level, const char *format, ...)
__attribute__(format, printf, 3, 4);
gcc也理解“scanf”,“strfmon”和“strftime”格式规范,只需将“printf”替换为适合您功能的内容。
答案 1 :(得分:4)
使用gcc,您可以使用--Wformat
选项:
检查对printf和scanf等的调用,以确保参数 提供的类型适合指定的格式字符串,和 格式字符串中指定的转换是有意义的。这个 包括标准函数,以及格式属性指定的其他函数 (参见函数属性),在printf,scanf,strftime和strfmon中 (X / Open扩展,而不是C标准)系列(或其他 特定目标家庭)。
有关详细信息,请参阅the gcc documentation。
编辑:更仔细地看一下,看起来你想检查你自己的函数的调用,这可能会转发对printf和朋友的调用。您可能需要使用format
function attribute修饰您的函数,以便从gcc中获取警告。
答案 2 :(得分:1)
我认为CPPCheck能够获得这些,而且还有更多...... {/ p>
编辑:嗯。我觉得它只适用于标准库函数,并且不了解可用于告诉GCC您的“自己的”函数使用格式字符串的“函数属性”。
答案 3 :(得分:0)
要记住关于__attribute__ ((format (printf, n, m)))
解决方案的一件事:如果你的函数是一个类的非静态成员方法,你必须在n和m上加1,因为它被编译成一个简单的函数,带有< strong> this 指针作为实际的第一个参数。