説明
関数から戻ると寿命が終了するローカル変数のアドレスや参照を返すと、呼び出し元が無効なスタックメモリを使うことになります。
想定される影響
- 返されたポインターの逆参照で、クラッシュや未定義の動作が発生する可能性があります。
- スタックの再利用によって、機密情報や誤ったデータが読み取られるおそれがあります。
対処方法
- 関数から戻ると寿命が終了するローカル変数のアドレスや参照を返さないでください。
- 値そのものを返すか、呼び出し元が用意した出力バッファーを使用してください。
- 動的な確保が必要なら、所有権の移転ルールと解放の責任を明確にしてください。
例
変更前
c
int *make_value(void) {
int value = 42;
return &value;
}
変更後
c
int make_value(void) {
int value = 42;
return value;
}
解説:
- 変更前: 関数から戻ると
valueの寿命が終了するため、返されたアドレスは無効です。 - 変更後: 値のコピーを返すため、スタックアドレスが外部に渡りません。