有沒有辦法檢查VLA中的緩衝區溢出?我用-fstack保護器,所有-Wstack保護器但得到這些警告:可變長度數組(VLA)的邊界檢查?
警告:沒有保護局部變量:可變長度的緩衝器
是否有實現這一圖書館嗎?
我目前使用Valgrind的和gdb(-lefence是堆內存)。
有沒有辦法檢查VLA中的緩衝區溢出?我用-fstack保護器,所有-Wstack保護器但得到這些警告:可變長度數組(VLA)的邊界檢查?
警告:沒有保護局部變量:可變長度的緩衝器
是否有實現這一圖書館嗎?
我目前使用Valgrind的和gdb(-lefence是堆內存)。
也許使用了alloca()會有所幫助。這很煩人,因爲c99應該可以讓你免於使用它,但是GCC手冊頁似乎說如果使用alloca(),堆棧保護代碼將會打開。
當然,真正的解決方案是編寫完美的,無bug的代碼,永遠不會破壞堆棧。
我看不出庫能爲你做到這一點;使用可變長度的數組,您不會調用任何函數來執行索引,所以沒有地方可以「掛鉤」庫。使用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);
}
然後拿出適當的宏定義(和輔助碼)來跟蹤訪問。正如我所說,它不會很漂亮。當然,這個想法是,宏可以「編譯」出純粹的定義,由一些構建時間設置(調試/釋放模式或其他)來控制。
您可以改用的-fmudflap -fstack保護器,所有
更新:有些文檔和選項都在這裏http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging