在C / C ++源代码中验证格式字符串的工具

时间:2013-01-28 09:34:49

标签: c++ c

我已经在大型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

4 个答案:

答案 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 指针作为实际的第一个参数。