コンテンツにスキップ

Memory Leak

メモリリーク

説明

メモリリークは、不要になった割り当て済みメモリブロックをアプリケーションが解放できないことによる、意図しないメモリ消費の一形態です。このような問題の影響は、アプリケーション自体によって異なります。

以下の一般的な3つのケースを考慮してください:

  • 短命のユーザーランドアプリケーション: 影響があるとしてもわずかです。最近のオペレーティングシステムは、プログラム終了後に失われたメモリを回収します。
  • 長寿命のユーザーランドアプリケーション: 潜在的に危険です。これらのアプリケーションは時間の経過とともにメモリを浪費し続け、最終的にはすべての RAM リソースを消費します。システムの異常な動作につながります。
  • カーネルランドプロセス: 非常に危険です。カーネルレベルでのメモリリークは、システムの安定性に深刻な問題を引き起こします。カーネルメモリはユーザーランドメモリに比べて非常に限られており、慎重に扱う必要があります。

次の例は、C 言語における基本的なメモリリークです。

#include <stdlib.h>
#include <stdio.h>

#define  LOOPS    10
#define  MAXSIZE  256

int main(int argc, char **argv)
{
     int count = 0;
     char *pointer = NULL;

     for(count=0; count<LOOPS; count++) {
          pointer = (char *)malloc(sizeof(char) * MAXSIZE);
     }

     free(pointer);

     return count;
}

この例では、サイズ MAXSIZE の割り当てが10回行われます。最後を除くすべての割り当てが失われます。割り当てられたブロックを指すポインタがない場合、プログラムの実行中に回復することはできません。この単純な例に対する簡単な修正は、free() 呼び出しを ‘for’ ループ内に配置することです。

推奨事項

アプリケーションでのメモリリークを回避することは困難です。メモリリークの検出と対処に役立つ以下の手順を実施できます。

  • プロファイリングツールの使用: Android Profiler(Android の場合)や Instruments(iOS の場合)などのメモリプロファイリングツールを使用して、メモリリークやメモリ使用パターンの特定を行います。
  • リーク検出ライブラリの使用: LeakCanary(Android の場合)や Instruments(iOS の場合)などのリーク検出ライブラリを開発プロセスに統合し、開発およびテストフェーズ中にメモリリークを自動的に検出して特定します。
  • Sanitizers の使用: HWAddressSanitizerGWP-ASanArm Memory Tagging Extension などのサニタイザを使用してアプリケーションをビルドすることを検討してください。

リンク

基準

  • OWASP_MASVS_L1:
    • MSTG_CODE_8
  • OWASP_MASVS_L2:
    • MSTG_CODE_8
  • CWE_TOP_25:
    • CWE_400
  • PCI_STANDARDS:
    • REQ_6_2
  • OWASP_MASVS_v2_1:
    • MASVS_RESILIENCE_4
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
    • CC_9_1
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255