2013-03-26 40 views
2

如果傳遞給函數的參數(const char * argument)是一個常量字面量或變量,是否有任何簡單的方法檢測?決定是否const char *是一個字符串文字或變量

我試圖修復一些代碼中的錯誤,這些代碼中充滿了IsBadWritePtr調用,如果參數是一個常量字面量,它會拋出訪問衝突異常。

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

+0

我不明白爲什麼它應該重要。無論是否由字符串文字創建,您都可以將指向「const char」數組的第一個元素的指針完全相同。 – 2013-03-26 14:52:17

+0

@sftrabbit我猜有兩個潛在的問題:它是一個空字符串?它是一個指向單個「char」的指針嗎? – juanchopanza 2013-03-26 14:54:56

+1

@MM .:說什麼?文字是*不是臨時的。它是*最少的*臨時類型的對象,因爲它的壽命是整個程序。 – 2013-03-26 14:59:46

回答

3

您可以添加一個不同的重載,這將會更好地匹配字符串文字。這是不是真的科學只是試探:

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' };將解析爲模板。它們都不是文字,但您可能不想修改。

一旦你做了這個改變,應該很簡單,找出每個重載被調用的地方。

這一切都是在主函數不應該將參數作爲const char*作爲內部修改的前提下工作的,而且您遇到的問題是因爲爲了向後兼容,編譯器允許調用函數一個指向非const的文本...

1

我不認爲有一種方法來檢測,至少不使用一些hackery。
由於接口需要一個const char *該函數的責任是無論如何不修改傳遞的字符串。你需要修改實現,因爲它是不正確的。

0

VirtualQuery可用於檢測地址是可寫的,只讀的還是不可訪問的。檢查返回的MEMORY_BASIC_INFORMATION結構的StateProtect成員以查看內存是否可訪問並且具有所需的訪問權限。

相關問題