7

タイトルの通り、10年以上前にAIX用に開発されたレガシーコードを移動する予定です。問題は、コードベースが巨大であるということです。開発者は、元のコードでポインターを初期化しませんでした。コードを最新のサーバーに移行しているときに、いくつかの問題が発生しました。

最善の解決策は、すべてのコードを実行し、必要に応じてすべての変数を初期化することです。しかし、私はこの問題に利用できる他の解決策があるかどうかを知りたいと思っています。グーグルを試しましたが、適切な答えが見つかりませんでした。

4

2 に答える 2

2

最も予防的な長期的アプローチは、宣言された場所ですべてのポインターを初期化し、適切なスマートポインターを使用して存続期間を管理するようにコードを変更することです。何らかの単体テストがある場合、このリファクタリングは比較的簡単です。

短期的には、Linuxに移植する場合は、valgrindを使用して、問題となっている1つまたは2つの実際の問題を追跡し、よりゆったりとしたペースでリファクタリングする時間を確保できます。

于 2013-01-22T16:26:57.473 に答える
2

すべての変数を初期化するだけでは、良い考えではないかもしれません。

信頼できる動作は、一般に、正しいことがわかっている(「構造によって保証された」正しい値を持つ)変数に依存します。初期化されていない変数の問題は、それらが未知の値を持っているということだけではありません。明らかに不明であることが問題ですが、ここでも、望ましい状態は既知の正しい値を持っていることです。変数を正しくない既知の値に初期化しても、信頼できる動作は得られません。

より複雑な初期化が失敗した場合のフォールバックとして使用するのに適切な「デフォルト」値がないことは、まれではありません。変数を使用する前にその値を上書きする必要がある場合、プログラムは変数を値で初期化しないことを選択できます。

このような場合、変数をデフォルト値に初期化すると、いくつかの問題が発生する可能性があります。多くの場合、「デフォルト」の値は、それらが使用された場合、結果がすぐには明らかではないという点で不快ではありません。開発者として、問題が発生したときに気づきたいので、これは一般的には望ましくありません。明らかな結果をもたらすデフォルト値を選択することでこの問題を回避できますが、それでも2番目の問題は解決しません。静的アナライザーは、初期化されていない変数が使用された場合に、それを検出してレポートできることがよくあります。値が設定されていないなどの複雑な初期化ロジックに問題がある場合は、それを検出できるようにする必要があります。デフォルト値を設定すると、静的分析でこのようなケースが検出されなくなります。そのため、変数を初期化したくない場合があります。


ポインターの場合、デフォルト値は通常です。これによりnullptr、nullポインターを逆参照すると通常はすぐにクラッシュするため、上記の最初の問題をある程度回避できます(デバッグに適しています)。ただし、コードがnullポインターを検出してエラーを報告したり(デバッグに適している)、他の方法にフォールバックしたり(デバッグに適さない)する場合もあります。静的分析を使用して、初期化されていないポインターの使用状況を検出する方がよい場合があります。静的分析はnullポインターの逆参照を検出する場合がありますが、nullポインターがエラー報告またはフォールバックルーチンの使用を引き起こす場合は検出されません。


あなたのコメントに応えて:

私が見る主な問題は

  • ローカル変数へのポインタは関数から返されます。
  • ほとんどすべてのポインタ変数は初期化されていません。AIXは以前のプラットフォームの顧客にこの快適さを提供すると確信していますが、実際のテスト(本番)に置かれているときにコードがLinuxで問題なく実行されるかどうかは本当に疑わしいです。
  • うまくいくかもしれない部分的な解決策を提供することはできません。私は私の仕事のために私にお金を払ってくれる私の顧客に最善を尽くすことを好みます。したがって、回避策を使用することを好みません。
  • 品質を損なうことはできません。
  • それらを修正します(そして正しくクリーンアップすることに特別な注意を払います)
  • 上で論じたように、単に初期化子がないこと自体は欠陥ではありません。初期化されていない値が実際に不正な方法で使用された場合にのみ、欠陥があります。快適さを提供するAIXについてあなたが何を意味するのかわかりません。
  • 上記で論じたように、「部分的な解決策」と「回避策」は、すべてを盲目的に初期化することです。
  • 繰り返しになりますが、すべてを盲目的に初期化すると、無駄な作業が発生するだけでなく、バ​​グを検出するためのツールをいくつか取り除いて、実際に品質を損なう可能性があります。
于 2013-01-22T17:23:53.350 に答える