メインコンテンツ

バッファー サイズがハードコードされています

メモリ バッファーのサイズがシンボリック定数ではなく数値になっている

説明

この欠陥は、配列などのメモリ バッファーを宣言する際に、シンボリック定数ではなく数値を使用した場合に発生します。

リスク

バッファー サイズがハード コードされていると、次の問題の原因となります。

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

  • ハード コードされている定数は、コードが開示された場合に攻撃にさらされることがある。

修正方法

バッファー サイズには、ハード コードされている定数ではなくシンボリック名を使用します。シンボリック名には、const 修飾子付き変数、enum 定数またはマクロを含めます。

enum 定数の使用を推奨します。

  • マクロは前処理後に、その定数値によって置き換えられます。したがって、ループ境界が外部にさらされる場合があります。

  • enum 定数はコンパイルの時点で既知となっています。したがって、コンパイラではループをより効率的に最適化できます。

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

すべて展開する

int table[100];

void read(int);

void func(void) {
    for (int i=0; i<100; i++)
        read(table[i]);
}

この例では、配列 table のサイズがハード コードされています。

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

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

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

int table_1[MAX_1];
int table_2[MAX_2];
int table_3[MAX_3];

void read(int);

void func(void) {
    for (int i=0; i < MAX_1; i++)
        read(table_1[i]);
    for (int i=0; i < MAX_2; i++)
        read(table_2[i]);
    for (int i=0; i < MAX_3; i++)
        read(table_3[i]);
}

結果情報

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

バージョン履歴

R2015b で導入