FUM.GEN.MUST
未割り当てメモリの解放
未割り当てメモリが解放されると、予測できない結果になる可能性があります。FUM.GEN.MUST チェッカーは、初期化されていないポインターで呼び出される割り当て解除関数を検出します。
脆弱性とリスク
free() が無効なポインターで呼び出されると、プログラムのメモリを破壊してプログラムがクラッシュする結果になったり、攻撃に悪用される脆弱性をもたらす可能性があります。
軽減と防止
非ヒープメモリの解放を回避するには、以下を確実に行います。
- 事前に malloc() を使用してヒープ上に割り当てられたポインターのみを解放します。
- ポインターを追跡して、1 回だけ解放します。
- プログラムの右側部分に属するメモリだけを解放します。
脆弱コード例
コピー
typedef struct list {
char * next;
} list;
typedef struct z {
list l;
} z;
void a6(){ // 8923
z * x = malloc(sizeof(z));
if (!x) return;
x->l.next=1;
free(x->l.next);
}
Klocwork は 12 行目で指摘レポートを生成し、'x->l.next' で参照され 11 行目で割り当てられ 12 行目で解放された未割り当てメモリを示します。未割り当てメモリを解放するとアプリケーションがクラッシュしたり、攻撃に対して脆弱になる可能性があります。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。