2

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

4 回答 4

6

如果使用gccand --Wformat,并且您有自己的功能,则需要使用__attribute__(format, printf, format_argno, first_var_arg)after 功能。

例如:

void log_print(FILE *logfile, int level, const char *format, ...)
   __attribute__(format, printf, 3, 4);

gcc 还理解“scanf”、“strfmon”和“strftime”格式规范,只需将“printf”替换为适合您功能的任何内容。

于 2013-01-28T09:55:40.863 回答
4

使用 gcc,您可以使用以下--Wformat选项:

检查对 printf 和 scanf 等的调用,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换是有意义的。这包括 printf、scanf、strftime 和 strfmon(X/Open 扩展,不在 C 标准中)系列(或其他特定于目标的系列)中的标准函数和其他由格式属性(请参阅函数属性)指定的函数。

有关更多详细信息,请参阅gcc 文档

编辑:更仔细地看一下,您似乎想要检查对您自己的函数的调用,这些函数可能会将调用转发给 printf 和朋友。您可能必须使用formatfunction 属性来装饰您的函数,以便从 gcc 获取警告。

于 2013-01-28T09:46:57.287 回答
1

我认为CPPCheck 会收集这些,还有很多很多......

编辑:嗯。我有一种感觉,它只适用于标准库函数,并且不理解你可以用来告诉 GCC 你自己的函数使用格式字符串的“函数属性”。

于 2013-01-28T09:50:05.640 回答
0

关于解决方案要记住一件事__attribute__ ((format (printf, n, m))):如果您的函数是类的非静态成员方法,则必须将 1 添加到 n 和 m 因为它被编译为一个简单的函数,this指针作为实际的第一个参数。

于 2013-12-17T17:54:43.687 回答