3

以前の質問に対するこの回答が指摘しているように、初期化されていない変数の値は不確定である可能性があります。この不確定なデータを指定して、たとえば繰り返す方法はあります0xDEADDEADか?不確定なデータは明らかにコンパイラ固有ですが、簡単に認識できるものにするように強制するのは常に良いことです。

これを可能にする既存のメモリリーク/破損検出ライブラリはありますか?オーバーロードnewは解決策のように見える場合もありますが、私はそのトリックを自分で掘り下げたくありません。

memset()問題は、不確定な値は通常、コードの未定義の動作を引き起こし、実行時のバグはめったに発生しないことです。たとえば、コードのどこかを忘れたかどうかを確認したいと思います。不確定な値をランダム化することでさえ、テストベンチとして役立つ可能性があります。

これが不可能な場合、問題を解決するためのより良いアプローチはありますか?

4

3 に答える 3

0

実行時に変数の値のパターンを確認するのは少し注意が必要です。あなたが言うように、それはコンパイラ/アーキテクチャに依存しています。

通常、静的分析ツールは、初期化されていない変数に関する警告を表示できます。これがあなたが遊ぶことができる無料の静的コードチェッカーです:cppcheck

于 2012-06-02T09:31:52.220 に答える
0

高品質のCコードを作成するためのガイドラインは次のとおりです。

  1. メモリのバグ(および他の種類のバグ)を回避するのに役立つコーディングガイドラインを作成/使用します。インターネット上には多くの例があります。最善のアプローチは、5または6を調べてニーズに合ったものだけを残して1つにコンパイルすることです。
  2. コードレビュー/検査を使用して、バグを見つけ、コーディングガイドラインの順守を確認します。コードレビューは、ツールでは検出できないバグを見つけるための最良の方法の1つです。コードレビューは、他の人が書いたコードをレビューするときとレビューされるときの両方で学習曲線を追加するため、初心者/中級のプログラマーにとって特に重要です。
  3. 自動的に実行できるテストケースを使用してコードをテストします。
  4. valgrindなどのツールを使用して、さまざまな種類のバグを見つけます。
于 2012-06-02T09:08:28.620 に答える
0

不確定な値があり、メモリ管理エラーがあり、2 つの交差があります。

C/C++コンパイラが不定値に対して何をするかはわかりません。(間違いなく C のような並列言語用に構築したコンパイラには、明示的なデバッグ スイッチがあり、割り当てられていないすべての変数に、「問題を引き起こす」ように設計された値を入力します。たとえば、int の場合、-2^31、ポインターの場合、特定の not-voidメモリアクセスフォールトが発生することが保証されている値など)。ここでのマイレージはコンパイラによって異なると思われます。

メモリ管理は難しいことで知られています。C++ では、通常の方法でコンストラクタとデストラクタを使用して、そのようなエラーの多くが発生しないようにすることができます。stackoverflow.com/questions/76796/memory-management-in-c を参照してください。

C はより難しく、コードを注意深く検査し、各ルーチンが割り当て、割り当て解除、またはどちらにも明確な責任を負っていることを確認することが役に立ちます。

C と C++ の両方で、静的解析ツール (Coverity、Fortify) を使用して、このような多くの割り当てエラーを検出できます。同様に、Valgrind などの動的分析ツールを使用できます。Valgrind は、オブジェクト コードの動作を監視し、メモリ管理エラーが発生したときにそれを停止します。C の場合のみ、動的解析CheckPointerツールを使用できます。valgrind が検出するすべてのエラーを検出します (たとえば、valgrind は [スタックに割り当てられた] ローカル配列の外部へのアクセスを検出できませんが、CheckPointer は検出できます)。

于 2012-06-02T10:20:21.583 に答える