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
をすべてと定義している唯一の主要な実装は、マクロの存在に関係なく、私の知る限りです。物事が変わったかもしれない。
「どうすれば削除できますか?」 - > 'sprintf_s()'を使わないでください。代替コードを見るために必要と思われるコードを投稿してください。 – chux
私はそれを使用する必要があります。 – npatel
クイック&ダーティな方法: '-Wnoimplicit-function-declaration'をコンパイラオプションに追加します。 – ForceBru