2011-04-18 87 views
5

有沒有辦法檢查VLA中的緩衝區溢出?我用-fstack保護器,所有-Wstack保護器但得到這些警告:可變長度數組(VLA)的邊界檢查?

警告:沒有保護局部變量:可變長度的緩衝器

是否有實現這一圖書館嗎?

我目前使用Valgrind的和gdb(-lefence是堆內存)。

回答

0

也許使用了alloca()會有所幫助。這很煩人,因爲c99應該可以讓你免於使用它,但是GCC手冊頁似乎說如果使用alloca(),堆棧保護代碼將會打開。

當然,真正的解決方案是編寫完美的,無bug的代碼,永遠不會破壞堆棧。

0

我看不出庫能爲你做到這一點;使用可變長度的數組,您不會調用任何函數來執行索引,所以沒有地方可以「掛鉤」庫。使用malloc()時,分配在函數中是顯式的,您可以跟蹤它。

當然,你可以通過代碼,並使用預處理弄虛作假一些宏添加到每個指示點,並有宏觀擴展到檢查邊界代碼。但這是非常侵擾性的。

我想是這樣變化的:

void work(int n) 
{ 
    int data[n]; /* Our variable-length array. */ 

    data[0] = 0; 
} 

成類似:

#include "vla-tracking.h" 

void work(int n) 
{ 
    VLA_NEW(int, data, n); /* Our variable-length array. */ 

    VLA_SET(data, 0, 0); 
} 

然後拿出適當的宏定義(和輔助碼)來跟蹤訪問。正如我所說,它不會很漂亮。當然,這個想法是,宏可以「編譯」出純粹的定義,由一些構建時間設置(調試/釋放模式或其他)來控制。