メインコンテンツへスキップ
見出し画像

【堅牢なエラー処理】4.3 ☠️ 致命的な操作

    メモリリークは「緩やかな死」ですが、ここで紹介する2つは 「即死」または「セキュリティホール」 に直結する危険なバグです。

    1. 💥 二重解放 (Double Free)

    同じアドレスに対して `free` を2回呼んでしまうこと。

    char *p = malloc(10);
    free(p);
    free(p); // クラッシュ!

    ヒープ管理システム(レンタル倉庫の管理人)は、「空き場所リスト」を管理しています。すでに返却された場所をもう一度返却されると、管理台帳が矛盾して壊れてしまいます。

    対策: `free` したらすぐに `NULL` を入れる。(`free(NULL)` は何もしないので安全)

    free(p);
    p = NULL; // 安全策

    2. 🧟 解放後使用 (Use-After-Free)

    `free` した後に、そのポインタを使って読み書きしてしまうこと。
    現代のセキュリティ脆弱性で最も危険なものの一つ です。

    char *p = malloc(10);
    free(p);
    // ... しばらくして ...
    strcpy(p, "Hacker"); // 危険!

    なぜ危険なのか?

    1. `free(p)` でメモリが返却される。

    2. 別の処理(例えばパスワード管理モジュール)が、その場所を `malloc` して使い始める。

    3. 古いポインタ `p` を使って書き込むと、「パスワード管理モジュール用の重要データ」を上書きしてしまう。

    これにより、攻撃者がシステムを乗っ取ることが可能になります。

    画像
    Use-After-Free

    3. 🎣 ダングリングポインタ (Dangling Pointer)

    「解放されたのに、まだ実体を指している(つもりになっている)ポインタ」のことを、ぶら下がっている(Dangling)ポインタと呼びます。

    教訓:
    「死んだ変数(解放済み領域)には死化粧(NULL代入)を」
    C言語プログラマの嗜みです。


     
     
    ITインストラクター、ITエンジニア、AIエンジニアなどのお仕事で生計を立てている猫です。おいしいご飯が大好きです。お好きに閲覧してやってくださいませ。いいねしてくれるととても喜びます😽