是否有任何简单的方法可以检测,如果传递给函数的参数(const char * argument)是常量文字还是变量?
我正在尝试修复某些代码中的错误,该代码充满了IsBadWritePtr调用,如果参数是常量文字,则会引发访问冲突异常。
这是一个可怕的设计愚蠢,但是现在我不允许更改笨拙的行为。
您可以添加其他重载,这将更适合字符串文字。这不是真正的science,而只是启发式:
void f(const char* p); // potential literal
void f(char *p); // pointer to non-const
另一个想法是利用文字确实是arrays >>:
与not notliteral,而是其他一些功能。template <int N> void f(const char (&_)[N]); // potential literal
请注意,它们并没有完全检测到literal
const char* p = createANewString(); f(p);
将解析为f(const char*)
,const char x[] = { 'A', 'b', 'c', '\0' };
将解析为模板。它们都不是literals,但是您可能都不希望对其进行任何修改。一旦进行了更改,应该很容易找出每个重载在哪里被调用。
这全部的前提是,如果主函数在内部对其进行修改,则主函数不应将其作为const char*
,并且面临的问题是,由于向后兼容,编译器允许调用带有以下参数的函数:指向带有文字的非常量的指针...
我认为没有一种方法可以在不使用某些黑客的情况下检测到至少。
VirtualQuery
可用于检测地址是否可写,只读或不可访问。检查返回的VirtualQuery
结构的State
和Protect
成员,以查看内存是否可访问并具有所需的访问权限。
一种非常不可靠的方法涉及检查指针是否在.rdata段中。