void hello(void) { fprintf(stderr, "hello!\n"); }
void fun(void) {
void *buf[10];
static int i;
for (i = 0; i < 100; i++) buf[i] = hello;
}
int main(void) {
int buf[1000];
fun();
return 0;
}
fun 的 buf[10] 越界寫入 90 個函數指針,覆蓋 main 的 buf[1000] 區域。main 的 buf 從未被讀取,且未覆蓋返回地址/幀指針,**程序正常返回 0**,hello 從未被調用,**實際無任何輸出**。main 中調用 ((void(*)())buf[50])() 會執行 hello 輸出,但屬偶然。 C 標準**不要求**陣列邊界檢查,性能優先。運行時行為屬**未定義行為 (UB)**。
| 場景 | 後果 |
|---|---|
| 覆蓋無關變數 | 邏輯錯誤,難復現 |
| 覆蓋返回地址 | 崩潰或代碼注入 |
| 啟用棧保護 | 運行時中止 |
| AddressSanitizer | 精準報告越界位置 |
**能跑通 ≠ 正確**。越界寫入屬嚴重 Bug,必須修復並開啟防護編譯選項。