コンテンツにスキップ

Improper Size Calculation (不適切なサイズ計算)

ルール ID

MI104

定義

ソフトウェアは、バッファーの割り当て時に使用するサイズを適切に計算していません。これは、バッファー オーバーフローにつながる可能性があります。

サンプル

次のコードは、CWE の該当コード サンプルの 1 つです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
int i;
unsigned int numWidgets;
Widget **WidgetList;

numWidgets = GetUntrustedSizeValue();
if ((numWidgets == 0) || (numWidgets > MAX_NUM_WIDGETS)) {
  ExitError("Incorrect number of widgets requested!");
}
WidgetList = (Widget **)malloc(numWidgets * sizeof(Widget *));
printf("WidgetList ptr=%p\n", WidgetList);
for(i=0; i<numWidgets; i++) {
  WidgetList[i] = InitializeWidget();
}
WidgetList[numWidgets] = NULL;
showWidgets(WidgetList);

次のコードは、最大数のウィジェットに対応するメモリを割り当てます。次に、ユーザーが指定したウィジェット数を取得し、要求されたウィジェット数が多すぎないことを確認します。その後、InitializeWidget() を使用して配列の要素を初期化します。ウィジェットの数はリクエストごとに異なる可能性があるため、コードは最後のウィジェットの位置を示すために NULL ポインターを挿入します。しかし、このコードにはオフ バイ ワン計算エラー (CWE-193) があります。ちょうど指定された数のウィジェットを格納できる領域を割り当てていますが、NULL ポインターの分の領域が含まれていません。結果として、割り当てられたバッファーのサイズは、期待される大きさより小さくなります(CWE-131)。 そのため、ユーザーが MAX_NUM_WIDGETS を要求すると、NULL を割り当てたときに境界外の書き込み (CWE-787) が発生します。これは、環境やコンパイル設定によっては、メモリ破壊の原因になる可能性があります。

参考資料

  • Common Weakness Enumeration: CWE-131