1

顧客がクラッシュを報告した C++ アプリケーションがありますが、クラッシュは簡単には再現できません。いくつかのログとすべてを分析した後、次のコード部分の間でクラッシュが発生する可能性があることがわかりました。これらのコードステートメントが含まれていると、アプリケーションがクラッシュする可能性があることを教えてください。

    //Tesrt
    std::string strAppName = "App1\0";
    int nSize = 10;
    sprintf_s(szBuff, "The appname %s have %d dependancies ", strAppName.c_str(), nSize);
    //Then use the szBuff to log to a text file
    //Test end
4

1 に答える 1

2

問題は、次の引数に正しい引数を指定しsprintf_sていないことです。

int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format [,
      argument] ... 
);

sprintf_ssize_t2番目の引数(のサイズ)としてを取りますが、それを指定szBuffしていません。代わりに、const char *そのパラメーターがあるべき場所を指定しました。これをコンパイルする唯一の方法は、コンパイラの警告を無視することです。

つまり、次のようになります。フォーマット文字列としてsprintf_sバッファに入れることができる多数の文字に出力するバッファ strAppName.c_str()

言い換えれば、これはあなたが望むようなことをしていません。2番目のパラメータとしてのサイズをszBuff指定してください。問題がなくなると思います。

そして、はい、あなたがしたことを考えると、私は至る所でクラッシュすることを期待します。

于 2012-06-29T11:22:12.680 に答える