INVARIANT_CONDITION.UNREACH

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

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

脆弱性とリスク

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

コード例

コピー
   enum status_codes {
       ST_UNKNOWN = -1,
       ST_SUCCESS,
       ST_INVALIDARG,
       ST_NOTFOUND,
       ST_FATAL,
   };
  
   extern void report_warn();
  extern void report_err();
 
 
  void report_status(int code)
  {
      if (code < 0) {
          exit(1);
      }
      if (code >= ST_FATAL) {
          report_err();
      } else {
          report_warn();
          if (code == ST_UNKNOWN) {  //   <== invariant condition
              exit(2);               // ( <== unreachable code )
          }
      }
  }

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

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

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。