INFINITE_LOOP.LOCAL

ローカル変数を持つ無限ループ

INFINITE_LOOP チェッカーは終了しないループのインスタンスを検出します。このチェッカーはループの終了を制御する変数を追跡し、条件が変わらない場合に欠陥のフラグを立てます。反復によってループ条件の有効値が変化しない場合、ループは終了しません。INFINITE_LOOP.LOCAL チェッカーは、その終了条件がローカル変数に基づいている無限ループを検出します。

脆弱性とリスク

無限ループはプログラムが無限にハングアップしたりクラッシュしたりする原因になり、CPU やメモリリソースの過剰な使用によってサービス拒否 (DoS) 攻撃を許すことになります。

脆弱コード例 1

コピー
    void infinite_loop(int a)
      {
        int i=0;
        while (true) {
          if (i >= 10) {
            if (a == 11) { 
              break;
            }
          }
         i++;
       }
     }

Klocwork はこの状況に無限ループのフラグを立てます。その理由は、ループのエントリーで 'a' が 11 に等しくならない限り目的の値に到達せず、したがってループが有効な終了条件に到達しないためです。この場合、INFINITE_LOOP.LOCAL チェッカーは、その終了条件がローカル変数に基づいている典型的な無限ループを検出しました。

修正コード例 1

コピー
    void infinite_loop(int a)
      {
        int i=0;
        while (true) {
          if (i >= 10) {
            if (a == 11) { 
              break;
            } else {
              a++;
            }
          }
         i++;
       }
     }

修正したコード例では、'a' が増分するため、関数は終了できます。

脆弱コード例 2

コピー
    void foo() {
      int i=get();
      int j=1;
      while(1) {
        if (i==1) {
          j++;
        } else {
          break;
        }
      }
    }

この例では、'i' が決して変化しないため、Klocwork は INFINITE_LOOP 欠陥のフラグを立てます。終了条件が不変のため、関数は終了できません。

修正コード例 2

コピー
    void foo() {
      int i=get();
      int j=1;
      while(1) {
        if (i==1) {
          i++;
        } else {
          break;
        }
      }
    }

修正したコード例では、変数 'i' を増分して関数の終了条件を変更しました。