2017-07-19 48 views
-1

私はこの行を持つCコードを持っています。sprintf_s()暗黙の宣言警告

sprintf_s(var, outfile_ppm, local_filecounter++); 

ここで、varはchar型で、local_filecounterはint型です。

私は、コードを実行すると、それは私にこの警告与える:

警告: 'sprintf_s' 関数の暗黙的な宣言がC99で無効である[-Wimplicit-関数宣言]

は何ですかこの警告と私はどのようにそれを取り除くことができますか?

+2

「どうすれば削除できますか?」 - > 'sprintf_s()'を使わないでください。代替コードを見るために必要と思われるコードを投稿してください。 – chux

+0

私はそれを使用する必要があります。 – npatel

+0

クイック&ダーティな方法: '-Wnoimplicit-function-declaration'をコンパイラオプションに追加します。 – ForceBru

答えて

4

sprintf_s機能は、Annex K/TR 24731境界チェックインターフェイスの一部です。しかし、これらのインタフェースに興味がある人はN1967 Field Experience With Annex K — Bounds Checking Interfacesと読んでください。以下はその抜粋です:

当初の提案及びISO/IEC TR 24731-1の批准以来、ほぼ10年以来以上十年にもかかわらず:2007、および境界チェックインタフェースの導入以来、ほぼ5年実行可能な準拠の実装は現れていません。 APIは引き続き議論の余地があり、実装要求は実装者によって引き続き拒否されています。

実際

、あなたがGCC C11 status pageを見れば、あなたが表示されます(強調追加):

境界チェック(附属書K)[オプション]:ライブラリの問題(実装されていない)

附属書K(sprintf_sと他の同様の_sバージョンの関数)の主な実装は、Visual Studioのみです。よく知られている説明は、これらの関数がMicrosoft 内部で、セキュリティの問題を解決するために独自のコードベースで使用されていることです。

他の実装では、同じ問題を解決するためにValgrind、mudflap、アドレスサニタイザーなどのツールが使用されています。これらの機能を実際に使用するコードベースはほとんどありません。

つまり、Visual Studioを使用していない場合は、これらの機能を使用することはできません。幸いにも、それらは必要ではありません。

問題のsprintf_sの呼び出しはsprintf_sへの3番目の引数がフォーマット文字列でなければなりません...

// Wait, what? Something smells fishy... 
sprintf_s(var, outfile_ppm, local_filecounter++); 

で始めることは非常に疑わしいですが、local_filecounter++はあまりにも不審な形式の文字列になりそうです。

通常、snprintfを使用してバッファに合わせて出力を切り捨てるか、C標準外の関数を使用する場合はasprintfを使用します。

char var[256]; 
snprintf(var, sizeof(var), outfile_ppm, localfile_counter++); 

場合varが配列あなたはそのサイズを計算するsizeof(var)を使用することはできませんタイプ、および関数の引数がここに適用として使用した場合のポインタに減衰するアレイに関する一般的な注意点を持っていないことに注意してください。

概要:sprintf_s()は、Visual Studioに切り替えたり、自分で実装しない限り使用できません。タフなクッキー。

マイナーノート:sprintf_sを希望する場合、理論的には__STDC_WANT_LIB_EXT1__を定義する必要があります。しかし、実際には、sprintf_sをすべてと定義している唯一の主要な実装は、マクロの存在に関係なく、私の知る限りです。物事が変わったかもしれない。

関連する問題