繁体   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