コンテンツにスキップ

Improper Memory Management (不適切なメモリ管理)

ルール ID

MI102

定義

ソフトウェアは、割り当てられたメモリを使用した後、適切にメモリを追跡して解放していません。これにより、徐々に空きメモリが消費されます。

サンプル

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/* process message accepts a two-dimensional character array of the form [length][body] containing the message to be processed */
int processMessage(char **message)
{
  char *body;

  int length = getMessageLength(message[0]);

  if (length > 0) {
    body = &message[1][0];
    processMessageBody(body);
    return(SUCCESS);
}
else {
  printf("Unable to process message; invalid message length");
  return(FAIL);
}
}

processMessage メソッドは、処理対象のメッセージを含む 2 次元文字配列を受け取ります。 2 次元文字配列の最初の文字配列にはメッセージの長さが含まれ、2 つ目の文字配列にはメッセージ本文が含まれています。getMessageLength メソッドは、最初の文字配列から長さを表す整数値を取得します。メッセージの長さが 0 より大きいことを検証した後、本体の文字配列ポインターは 2 次元文字配列の 2 つ目の文字配列の先頭を指しており、新しい本体文字配列のためにメモリが割り当てられます。このサンプルは、本体文字配列の長さが非常に大きく、過剰なメモリを消費し、システム リソースが枯渇する状況を発生させます。最大長のチェックを行って、2 つ目の文字配列の長さを制限することで、このような状況を避けられます。

参考資料

  • Common Weakness Enumeration: CWE-400
  • Common Weakness Enumeration: CWE-401