假設我在我們的項目中有很多strcpy,strcat & memcpy的外觀(一個非常大的!)。 如何輕鬆檢測到源和目標指針之間有重疊的地方。如何找到strcpy中的src&dest與類似函數之間的重疊
我知道valgrind可以做到這一點,但並不是所有的情況都可以在vilgrind運行時檢測到(有很多可能的流程)。
確實有人知道gcc強化是否可以爲這個問題提供解決方案? 或者其他想法,除了包裝這些功能,並自己檢查它?
假設我在我們的項目中有很多strcpy,strcat & memcpy的外觀(一個非常大的!)。 如何輕鬆檢測到源和目標指針之間有重疊的地方。如何找到strcpy中的src&dest與類似函數之間的重疊
我知道valgrind可以做到這一點,但並不是所有的情況都可以在vilgrind運行時檢測到(有很多可能的流程)。
確實有人知道gcc強化是否可以爲這個問題提供解決方案? 或者其他想法,除了包裝這些功能,並自己檢查它?
你可以編寫一個包裝來動態檢查它們。
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
後面不要包含任何系統頭文件。在這些代碼之前,所有需要的系統標題應該是#include
d。
不可能靜態檢查,因爲編譯器不知道這些指針的運行時間值。
即使在運行時檢查也只會告訴您,您運行的測試的遠端不會產生重疊的字符串。
另一種辦法是不要擔心,並簡單地改變每個memcpy
到memmove
,每strcpy(d,s)
到memmove(d,s,strlen(s)+1)
(這當然可以被放置在一個內聯函數)。在大多數情況下,性能差異可以忽略不計。這應該花費你整整5分鐘的時間與perl
相比,這將是一個更有效率的使用時間比儀表批或理解每個電話。
沒有任何方法可以靜態查找所有這類潛在的問題。 –