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を使用していて、独自の関数がある場合は、 after関数--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」を関数に適したものに置き換えるだけです。

于 2013-01-28T09:55:40.863 に答える
4

gccでは、次の--Wformatオプションを使用できます。

printfやscanfなどの呼び出しをチェックして、指定された引数が指定されたフォーマット文字列に適切な型を持っていること、およびフォーマット文字列で指定された変換が意味をなすことを確認します。これには、printf、scanf、strftime、およびstrfmon(C標準ではなくX / Open拡張機能)ファミリ(またはその他のターゲット固有のファミリ)の標準関数、およびフォーマット属性(関数属性を参照)で指定されるその他の関数が含まれます。

詳細については、gccのドキュメントを参照してください。

編集:これをもっと注意深く見ると、printfや友人に呼び出しを転送する可能性のある独自の関数への呼び出しを確認したいようです。gccから警告を取得するには、おそらく関数をformatfunction属性で装飾する必要があります。

于 2013-01-28T09:46:57.287 に答える
1

私はCPPCheckがそれらを拾うと思います、そしてたくさん、もっとたくさん...

編集:うーん。標準ライブラリ関数でのみ機能し、「独自の」関数がフォーマット文字列を使用していることをGCCに伝えるために使用できる「関数属性」を理解していないように感じます。

于 2013-01-28T09:50:05.640 に答える
0

このソリューションについて覚えておくべきことの1つ__attribute__ ((format (printf, n, m)))は、関数がクラスの非静的メンバーメソッドである場合、thisポインターを実際の最初のパラメーターとして持つ単純な関数としてコンパイルされるため、nとmの両方に1を追加する必要があります。

于 2013-12-17T17:54:43.687 に答える