1

現在、優れたコード分析ツールが付属している Visual Studio 2010 を使用しています。

反復中にコレクションを変更しようとする呼び出しを見つけるように指示する方法はありますか? そして、他のコード分析でできることはありますか?

目的は、実行時に発生するタイトルのような例外を防ぐことです。

4

2 に答える 2

2

これは通常、スレッド間で共有されているコレクションへのアクセスを適切にロックしていないスレッドによって引き起こされるバグです。それ自体がスレッドセーフな操作であるため、コレクションを反復するコードでは特に見落とされがちです。反復中に要素を追加または削除すると、カブームが発生します。はい、コレクションを変更したコードでは発生しないため、診断が困難です。被害が発生してからしばらく経って初めてわかります。

スレッド化されていないコードでも可能ですが、デバッグは簡単です。

コード内のタイミングの問題を分析できる静的アナライザーは存在しません。実行タイミングは完全に非決定論的です。もしそうなら、スレッドセーフなコードを書くことは非常に簡単になるでしょう。この問題を解決すると同時に効率を完全に破壊しない人は誰でもノーベル賞を受賞するでしょう.

于 2012-05-10T12:43:59.100 に答える
1

列挙子の取得と列挙子のMoveNext()またはReset()メソッドの呼び出しの間でコレクションが同期的に変更される場合、1つの特殊なケースをチェックするルールを作成することができます。残念ながら、これでも実際には困難です。列挙可能なタイプごとに変更検出を異なる方法で実装できるため、実際の変更を検出することは簡単ではありません。

基本的に、この対処可能なシナリオのために多くの問題が発生しない限り、これは実際には価値のない種類のことです。標準的なテスト中に検出するのは非常に簡単なので、通常はそうではありません。

于 2012-05-10T13:08:56.327 に答える