6

私は大学のソフトウェア品質保証コースで循環的複雑性を研究していますが、述語ステートメントまたはノードに複合条件がある場合にどのように機能するかを理解するのに苦労しています。循環的複雑性の複数の定義を見てきましたが、私のクラスで使用された主な定義は

V(G) = # of predicate nodes (with outdegree = 2) + 1

したがって、このようなプログラム グラフの場合、循環的複雑度は 2 になります。

V(G) = 2

循環的複雑度が 2 のプログラム グラフ

また、次のように与えられる循環的複雑度の定義も見てきました。

V(G) = # edges - # nodes + 2

これは、上記のグラフでも機能します。ただし、述語ノードには複合条件があります。そして、自動短絡のための言語とシステムのセットアップを検討します。私には、左下のグラフをグラフに拡張する必要があるように思われます。以下のような場合、実際のソース コードでは if 文が 1 つしかない場合でも、サイクロマティック複雑度は 3 になりますか、それとも V(G) = 2 のままですか? .

循環的複雑度について私が目にする定義のほとんどは述語ノードについて話しているため、混乱を招きます。これが当てはまらない場合、ショートサーキット動作はパフォーマンスを向上させますが、実際に考慮した場合、サイクロマティックの複雑さを高めているようです。ソースコードが与えられた場合、循環的複雑度を計算する前に、すべての条件を左側のグラフのように独自のノードに分割する必要がありますか? プログラム グラフを展開して短絡動作を表示

4

1 に答える 1

2

C (C++、Java、C#) では、「&&」演算子は短絡評価を使用するように定義されているため、複雑さが増します。この場合の循環的複雑度は 3 になります。

http://hissa.nist.gov/HHRFdata/Artifacts/ITLdoc/235/chapter4.htmを参照してください。

「ブール演算子は、副作用の条件付き実行につながる可能性のある短絡評価セマンティクスを持っているかどうかに応じて、複雑さに1つ追加するか、何も追加しません。」

図 4-4 には、注釈付きのソース コードと対応するフロー グラフがあり、複雑さがどのように決定されるかを示しています。

IF((A>B) AND (C>D)) および IF((A>B) OR (C>D)) の循環的複雑度も参照してください。

于 2013-03-09T02:36:48.970 に答える