EN JP CN

INVARIANT_CONDITION.UNREACH

INVARIANT_CONDITION.UNREACH

条件における不変式は、到達不能コードを引き起こします

INVARIANT_CONDITION.UNREACH チェッカーは、ブランチにおいて、到達不能なコード指摘を起こす、選択または反復ステートメントで真偽条件を検索します。これは、原因に関わらず、到達不能コード自身を報告する、UNREACH.GEN または UNREACH.RETURN などの到達不能コードチェッカーと異なります。INVARIANT_CONDITION.UNREACH チェッカーは、到達不能コードを生じた条件のみを報告します。これらのチェッカーは類似した指摘を検出するため (方法はわずかに異なる)、到達不能コードチェッカーがオフになっているときにのみ INVARIANT_CONDITION.UNREACH をオンにすることが妥当に思われます。

脆弱性とリスク

到達不能条件は、記述されたコードとその設計意図との不一致により、意図しないプログラム動作を引き起こす可能性があります。到達不能条件は、コードのメンテナンスやレビュー時に混乱を引き起こすこともあります。

コード例

  1 enum status_codes {
  2     ST_UNKNOWN = -1,
  3     ST_SUCCESS,
  4     ST_INVALIDARG,
  5     ST_NOTFOUND,
  6     ST_FATAL,
  7 };
  8
  9 extern void report_warn();
 10 extern void report_err();
 11
 12
 13 void report_status(int code)
 14 {
 15     if (code < 0) {
 16         exit(1);
 17     }
 18     if (code >= ST_FATAL) {
 19         report_err();
 20     } else {
 21         report_warn();
 22         if (code == ST_UNKNOWN) {  //   <== invariant condition
 23             exit(2);               // ( <== unreachable code )
 24         }
 25     }
 26 }

ライン 15 における前のチェックにより、変数「コード」はこのパスにある負ではない値により守られているので、Klocwork Insight はライン 22 のcode == ST_UNKNOWN条件を INVARIANT_CONDITION.UNREACH指摘として報告します。ライン 13 においてこの条件により制御されているコードブランチは到達不能です。

この指摘を修正するには、条件がチェックされる順序を変更します。