2016-03-20 6 views
2

「書式文字列が文字列リテラルではありません」修正:私は狂気私を運転している私のコードで警告持って警告

int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap) 
{ 
    // Do stuff... 
    // ... 
    return vasprintf(bufptr, fmt, ap); 
} 

クラン(3.6.0)を、フォーマット文字列「と文句を言うことは文字列ではありません「リテラル」は、転送されているfmt引数を参照しています。もちろん、コンパイルされません

return vasprintf(bufptr, reinterpret_cast<const char[]>(fmt), ap); 

単純には、私がしようとしました。

私は何をしますか?警告を完全に無効にすることは選択肢ではありません。私は警告をしたい。しかし、この場合、私は自分が何をしているのかをコンパイラに伝えたいと思います。

+0

おそらく、私は100%は確信していませんが、変数を渡すときにこれがどのように有効な定数になるかはわかりません(したがって、cosntantの代入はできません)。あなたはその部分を削除しようとしましたか? –

+0

@DavyCあなたはキャストを意味しますか?うん、 'const'の有無にかかわらず同じ結果。 –

答えて

4

あなたはクランを伝えることができますパラメータが属性フラグを使用するprintf形式の形式であることを確認します。このようなものが動作するはずです、あなたのケースではthe documentation

を参照してください:

__attribute__((__format__ (__printf__, 2, 0))) 
int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap) 
{ 
... 
} 

編集:(va_listパラメータのチェックオフにします)トウモロコシの茎の提案どおりに0に最後のパラメータを変更しました。

+0

私はそれが '__attribute __((__ format__(__printf__、2、0)))'であるべきだと思います。 [GCCのドキュメント](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes)は次のように言っています: "引数がチェックされない関数の場合* vasprintf_wrapperが使用されているときに警告が保存されるので、私のアプローチよりもあなたのアプローチが好きなので、+1してください。 – Cornstalks

+0

ありがとう!私は '__format__'属性が存在していても覚えていません。コーンストークスの提案(最後のパラメータは0)が機能します。 3ではコンパイルされません。 –

4

このタイプの警告を可能にする警告フラグは-Wformat-nonliteralです。あなたは完全にその警告をオフにしたくないので、あなたは、ローカルに次のコードを使用して、この警告を無効にすることができます

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wformat-nonliteral" 

... 

#pragma clang diagnostic pop 

だからあなたの関数は次のようになります。

int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap) 
{ 
    // Do stuff... 
    // ... 

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wformat-nonliteral" 
    return vasprintf(bufptr, fmt, ap); 
#pragma clang diagnostic pop 
} 
+0

ありがとうございます。レコードに関しては、これはうまくいきますが、他の答えで述べたように、 '__format__'属性が実際にコンパイル時のチェックを呼び出し側にプッシュします。これは、関数が呼び出されたときだけ警告が出されることを意味します無条件で放出されるのではなく、リテラルではない。両方の答えが働くので、その属性はより安全です。そのため、私はその1つを選択しました:-) –

+0

@NikosC。良い、あなたは他の答えを選ぶ必要があります:)それは私より優れています。誰かがそれを見つけた場合に備えて、私はここにいます。 – Cornstalks

関連する問題