したがって、ここでは、他の誰かのコードを確認したときに見つけた小さなバッファオーバーフローの問題があると思います。それはすぐに私を不正確で潜在的に危険であると感じましたが、確かに、この「間違い」の実際の結果を説明することはできませんでした。
エラーを実証するためにテストアプリを作成しましたが、オーバーフローに関係なく正しく実行されているように見えることがわかりました(残念ながら)。これは偶然だと信じたいのですが、私の考えが間違っているのか、それともテストアプリに頭が表示されていないという問題が本当にあるのかを判断するためのフィードバックが必要でした。
問題のコード(とにかくそうだと思います):
char* buffer = new char[strlen("This string is 27 char long" + 1)];
sprintf(buffer, "This string is 27 char long");
さて、これが私に目立った理由であり、バッファオーバーフローの可能性があるとしてフラグを立てたいのは、最初のが原因ですstrlen
。ポインタ演算のため、の「誤った」配置により、+ 1
ではなくがstrlen
返されます(「彼の文字列は27文字の長さ」の長さを取る)。、私は信じています、そして27文字をバッファに出力し、バッファオーバーフローを引き起こしました。26
27
sprintf
それは正しい評価ですか?
私が見ているコードの人のためにこれを実証するためにテストアプリを作成しましたが、デバッガーでも文字列が正しく出力されることがわかりました。また、このコードの前後に他の変数をスタックとヒープに配置して、メモリの隣接領域に影響を与える可能性があるかどうかを確認しようとしましたが、それでも正しい出力を受け取っていました。新しく割り当てられたヒープメモリが隣接していない可能性があることを認識しています。これは、有用なオーバーフローがないことを説明しますが、これが実際に問題であるかどうかを他の人の意見で確認したかっただけです。
これは非常に単純な「質問」なので、何らかの参照を使用して回答をサポートできれば便利です。私はあなたの意見を尊重し、歓迎しますが、最終的な答えとして「はい、そうです」を受け入れるつもりはありません。よろしくお願いします。
更新:多くの追加の洞察を伴う多くの良い答え。残念ながら、すべてを受け入れることはできません。あなたの知識を共有し、私の「第二の意見」であることに感謝します。私は助けに感謝します。