簡體   English   中英

LabWindows CVI如何檢測C中的緩沖區溢出

[英]How the LabWindows CVI detects buffer overflow in C

昨天,我發現當我在C中運行一些簡單的代碼時,CVI可以檢測到緩沖區溢出,這讓我很困惑。

void main(void)
{
int a[10];
int buf[10];    
int test[10];
int *p = &buf[10];
*p = 1;
while(1);
}

當我可以運行該程序時,就會發生錯誤。消息是“取消引用數組末尾超出1個字節(1個元素)的越界指針”(抱歉,不允許發布圖像)

我很困惑如何實現,因為我知道C / C ++不具備內建數組邊界。 我還在VC ++ 6.0和Linux等其他平台上進行了嘗試,沒有人可以檢測到溢出。 謝謝。

我沒有使用LabWindows / CVI,但是從您對此的簡短討論中,我猜測它在運行時而不是在編譯時檢測到了這種越界取消引用。 靜態代碼分析(可以在不運行軟件的情況下在編譯時執行正確性檢查)受其捕獲的錯誤類型的限制。 在您的簡單示例中,可以想象編譯器會捕獲此錯誤,但在一般情況下它無法捕獲此類錯誤,因為即使對於最強大的功能,跟蹤可能進入大型程序的所有輸入組合的數據流也是一個棘手的問題超級計算機,即使讓它永遠困擾着這個問題。

一般情況下,解決此類問題的唯一方法是通過動態程序分析:通過運行時邊界檢查自動檢測代碼本身,和/或通過跟蹤所有內存分配邊界並進行驗證的模擬器執行代碼所有訪問都違反這些邊界。 前一種策略的示例實現是Ada編程語言,在該語言中,關鍵任務安全被認為比性能重要得多。 但就Ada而言,該語言旨在允許進行此類檢查。 C或C ++語言的實現可能會執行類似的操作,但是該語言中原始指針的存在將使處理起來更加困難,並且可能花費更多的運行時間。

在C和C ++中,如果您需要這種運行時邊界檢查(僅用於測試),則可以考慮使用Valgrind。 我知道沒有其他工具可以更全面地捕獲越界訪問。 但是要准備好讓程序真正緩慢地運行。 也許LabWindows / CVI與Valgrind類似?

無論如何,您都需要意識到,無論使用哪種驗證工具,使用運行時邊界檢查來捕獲錯誤代碼的唯一方法是,是否向程序提供了引發越界行為的輸入。 任何驗證工具都沒有出現邊界檢查失敗的情況,並不表示您的程序沒有此類錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM