簡體   English   中英

確定 const char* 是字符串文字還是變量

[英]Decide if const char* is a string literal or a variable

是否有任何簡單的方法可以檢測傳遞給函數(const char *argument)的參數是常量文字還是變量?

我正在嘗試修復某些代碼中的錯誤,這些代碼充滿了 IsBadWritePtr 調用,如果參數是常量文字,則會拋出訪問沖突異常。

這是一個可怕的設計愚蠢,但現在我不允許改變尷尬的行為。

您可以添加一個不同的重載,這將更好地匹配字符串文字。 這不是真正的科學,而只是啟發式:

void f(const char* p); // potential literal
void f(char *p);       // pointer to non-const

另一個想法是利用文字實際上是數組

template <int N>
void f(const char (&_)[N]); // potential literal 

請注意,它們並沒有完全檢測到文字不是文字,而是檢測其他一些功能。 const char* p = createANewString(); f(p); 將解析為f(const char*)const char x[] = { 'A', 'b', 'c', '\\0' }; 將解析為模板。 它們都不是literals ,但您可能也不想修改。

一旦進行了更改,就應該很容易找出每個重載的調用位置。

這一切的前提是,如果主函數在內部修改它,則它不應將參數作為const char*使用,並且您面臨的問題是因為為了向后兼容,您的編譯器允許調用帶有指針的函數與文字非常量...

我不認為有一種方法可以在不使用一些黑客的情況下至少檢測到這一點。
由於接口采用const char *函數,因此無論如何都不修改傳遞的字符串。 您需要修改實現,因為它完全不正確。

VirtualQuery可用於檢測地址是否可寫、只讀或不可訪問。 檢查返回的MEMORY_BASIC_INFORMATION結構的StateProtect成員以查看內存是否可訪問以及是否具有您需要的訪問權限。

一種非常hackish 的方法是檢查指針是否在.rdata 段中。

在構建后使用dumpbin /headers來檢索 .rdata 部分的偏移量和長度,或者自己解析 PE 頭。 自然,這是特定於工具鏈的,通常是個壞主意。 此外,如果代碼需要與 DLL 互操作,則必須檢查多個可執行文件和多個 .rdata 段。

暫無
暫無

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

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