スタックアドレスの返却

スタック領域のアドレスの返却

説明

関数から戻ると寿命が終了するローカル変数のアドレスや参照を返すと、呼び出し元が無効なスタックメモリを使うことになります。

想定される影響

  • 返されたポインターの逆参照で、クラッシュや未定義の動作が発生する可能性があります。
  • スタックの再利用によって、機密情報や誤ったデータが読み取られるおそれがあります。

対処方法

  1. 関数から戻ると寿命が終了するローカル変数のアドレスや参照を返さないでください。
  2. 値そのものを返すか、呼び出し元が用意した出力バッファーを使用してください。
  3. 動的な確保が必要なら、所有権の移転ルールと解放の責任を明確にしてください。

例

変更前

c
int *make_value(void) {
    int value = 42;
    return &value;
}

変更後

c
int make_value(void) {
    int value = 42;
    return value;
}

解説:

  • 変更前: 関数から戻ると value の寿命が終了するため、返されたアドレスは無効です。
  • 変更後: 値のコピーを返すため、スタックアドレスが外部に渡りません。

参考資料