ある時点で長いデータ型が int データ型にリファクタリングされたレガシー コードがいくつかあります。このリファクタリング中に、多くの printf / sprintf フォーマット ステートメントが、%d に変更されずに %ld として正しく残されていました。例えば:
int iExample = 32;
char buf[200];
sprintf(buf, "Example: %ld", iExample);
このコードは、GCC と VS2012 コンパイラの両方でコンパイルされます。私たちは静的コード分析に Coverity を使用し、例のようなコードは重大度が中レベルの「Printf 引数タイプの不一致」としてフラグが付けられました 。フォーマット文字列は、unsigned int 型またはこれらの行に沿った何かを持つ符号付き (%d) の文字列でした。
sprintf などの '_s' バージョンの方が安全であり、上記のコードは std::stringstream などを使用するようにリファクタリングできることも認識しています。ただし、これはレガシー コードです...
上記のコードは、少なくとも %d を使用するか、代わりに std::stringstream のようなものを使用するようにリファクタリングする必要があることに同意します。
好奇心から、上記のコードが間違った結果を生成する状況はありますか? このレガシー コードはかなり前から存在しており、正常に動作しているようです。
更新しました
- STL という単語の使用を削除し、std::stringstream に変更しました。