GCCで、printfスタイルの呼び出しで構文チェックを実行する方法と同様のことを実行したいと思います(引数リストが呼び出しに対して実際に正しいことを確認するため)。
可変数のパラメーターを受け取る関数がいくつかあります。送信されるパラメーターを強制するのではなく、渡されるパラメーターの数NULL
に関係なく、最後に渡されるパラメーターがであることを確認する必要があります。
コンパイル時にGCCにこのタイプの構文チェックを実行させる方法はありますか?
GCCで、printfスタイルの呼び出しで構文チェックを実行する方法と同様のことを実行したいと思います(引数リストが呼び出しに対して実際に正しいことを確認するため)。
可変数のパラメーターを受け取る関数がいくつかあります。送信されるパラメーターを強制するのではなく、渡されるパラメーターの数NULL
に関係なく、最後に渡されるパラメーターがであることを確認する必要があります。
コンパイル時にGCCにこのタイプの構文チェックを実行させる方法はありますか?
おそらくセンチネル関数属性が必要なので、次のように関数を宣言します。
void foo(int,double,...) __attribute__((sentinel));
プラグインまたはMELT拡張機能を使用してGCCをカスタマイズし、可変個引数関数をより正確に型チェックすることを検討してください。つまり、GCCを独自の属性で拡張して、より正確なチェックを行うことができます(または、関数の名前に基づいて追加のチェックを行うだけです)。
Melt -examplesの例はex06/
、janssonライブラリに対して同様のチェックを行っています。残念ながら、その例は今日2012年10月18日に不完全ですが、私はまだそれに取り組んでいます。
NULL
さらに、次のような例を常に追加することで、このような関数を呼び出す可変個引数マクロを定義できます。
#define FOO(N,D,...) foo((N),(D),##__V_ARGS__,NULL)
次に、コーディングすることで、aが追加されていることを確認できますFOO(i+3,3.14,"a")
。foo((i+3),(3.14),"a",NULL)
NULL
Basile Starynkevitchは正しいです、関数属性を使用してください。コンパイラに「呼び出し元がこの関数の戻り値をチェックしない場合、エラーです」と伝えることができるなど、他にも多くの便利な関数属性があります。
スプリントがあなたをチェックできるかどうかも確認したいと思うかもしれませんが、私はそうは思いません。それは私の記憶に残っていただろうと思います。
GCCコンパイラフラグのこのページをまだ読んでいない場合は、それも読んでください。そこにはたくさんの便利な小切手があります。 http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html