long long FibonacciSeq(int n) {
long long *fib = new long long[n+1]; // n=0 時僅分配 1 個元素
fib[0] = 0;
fib[1] = 1; // n=0 時越界寫入!
for (int i = 2; i <= n; i++) fib[i] = fib[i-1] + fib[i-2];
long long ret = fib[n];
delete[] fib;
return ret;
}
Debug 模式下,MSVC 在堆塊頭尾放置0xFD保護位模式。
n=0時:
1. new long long[1]分配 8 字節,前後各 4 字節0xFD保護區。
2. fib[0]=0正常。
3. fib[1]=1寫入第 2 個long long(偏移 8 字節),**正好覆蓋右側保護區**。
4. delete[]檢測到右側保護區損壞,觸發斷點中斷。
[左保護區 4B][fib[0] 8B][右保護區 4B][堆管理元數據...]
↑fib指針
fib[1] 寫入位置 → 覆蓋右保護區
long long FibonacciSeq(int n) {
if (n == 0) return 0; // 邊界條件檢查!
long long *fib = new long long[n+1];
fib[0] = 0; fib[1] = 1;
for (int i = 2; i <= n; i++) fib[i] = fib[i-1] + fib[i-2];
long long ret = fib[n];
delete[] fib;
return ret;
}
n >= 0、size > 0)。std::vector自動管理內存、邊界檢查(at())。/RTCs、-fsanitize=address)捕獲越界。