2015-07-19 44 views
0

假設我在我們的項目中有很多strcpy,strcat & memcpy的外觀(一個非常大的!)。 如何輕鬆檢測到源和目標指針之間有重疊的地方。如何找到strcpy中的src&dest與類似函數之間的重疊

我知道valgrind可以做到這一點,但並不是所有的情況都可以在vilgrind運行時檢測到(有很多可能的流程)。

確實有人知道gcc強化是否可以爲這個問題提供解決方案? 或者其他想法,除了包裝這些功能,並自己檢查它?

+0

沒有任何方法可以靜態查找所有這類潛在的問題。 –

回答

0

你可以編寫一個包裝來動態檢查它們。

void *memcpy_check(void *dest, const void *src, size_t n) 
{ 
    // Code to examine whether dest and src overlap. 
    // If overlap, abort() or report error. 
    memcpy(dest, src, n); 
} 

#define memcpy memcpy_check 

警告在行#define後面不要包含任何系統頭文件。在這些代碼之前,所有需要的系統標題應該是#included。

不可能靜態檢查,因爲編譯器不知道這些指針的運行時間值。

0

即使在運行時檢查也只會告訴您,您運行的測試的遠端不會產生重疊的字符串。

另一種辦法是不要擔心,並簡單地改變每個memcpymemmove,每strcpy(d,s)memmove(d,s,strlen(s)+1)(這當然可以被放置在一個內聯函數)。在大多數情況下,性能差異可以忽略不計。這應該花費你整整5分鐘的時間與perl相比,這將是一個更有效率的使用時間比儀表批或理解每個電話。

相關問題