メインコンテンツ

ループ境界がハード コードされています

ループ境界がシンボリック定数でなく数値になっている

説明

この欠陥は、forwhile、または do-while ループの境界にシンボリック定数ではなく数値を使用した場合に発生します。

リスク

ループ境界がハード コードされていると、次の問題の原因となります。

  • ループ境界がハード コードされていると、時間のかかる計算やリソース割り当てがループに含まれている場合に、サービス拒否攻撃に対する脆弱性が生じる。

  • ループ境界がハード コードされていると、誤りが生じる可能性が大きくなり、保守コストが高くなる。ポリシーの変更によりループ境界の変更が必要になった場合、開発者はコードに境界が出現するたびに変更しなければならない。

    たとえば、ループ境界が 10000 であり、ネットワーク サーバー アプリケーションでサポートされているクライアント接続数の最大値を表現しているとします。サーバーでサポートしているクライアント数がこれより多い場合、コード内のループ境界のインスタンスをすべて変更しなければなりません。ループ境界が 1 回しか発生しない場合でも、コード内の 10000 の数値に対して検索しなければなりません。この数値は、ループ境界以外の場所にも現れる可能性があります。こうした場所は、ループ境界を検索する前に参照しておかなければなりません。

修正方法

ループ境界に、ハード コードされている定数ではなくシンボリック名を使用します。シンボリック名には、const 修飾子付き変数、enum 定数またはマクロが含まれます。以下の理由により、enum 定数の使用が推奨されます。

  • マクロは前処理後に、その定数値によって置き換えられます。したがって、バッファー サイズが外部にさらされる場合があります。

  • enum 定数はコンパイルの時点で既知となっています。したがって、コンパイラではストレージをより効率的に割り当てられます。

    const 修飾子付き変数は、多くの場合、実行時に既知となります。

すべて展開する

void performOperation(int);

void func(void) {
    for (int i=0; i<100; i++)
        performOperation(i);
}

この例では、for ループの境界がハード コードされています。

修正 — シンボリック名を使用

考えられる 1 つの修正方法として、ハード コードされているループ境界をシンボリック名に置き換えます。

const int MAX_1 = 100;
#define MAX_2 100
enum { MAX_3 = 100 };

void performOperation_1(int);
void performOperation_2(int);
void performOperation_3(int);

void func(void) {
    for (int i=0; i<MAX_1; i++)
        performOperation_1(i);
    for (int i=0; i<MAX_2; i++)
        performOperation_2(i);
    for (int i=0; i<MAX_3; i++)
        performOperation_3(i);
}

結果情報

グループ: 適切な手法
言語: C | C++
既定値: オフ
コマンド ライン構文: HARD_CODED_LOOP_BOUNDARY
影響度: Low

バージョン履歴

R2015b で導入