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 の使用:
HWAddressSanitizer、GWP-ASan、Arm 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