确定const char *是字符串文字还是变量

问题描述 投票:2回答:4

是否有任何简单的方法可以检测,如果传递给函数的参数(const char * argument)是常量文字还是变量?

我正在尝试修复某些代码中的错误,该代码充满了IsBadWritePtr调用,如果参数是常量文字,则会引发访问冲突异常。

这是一个可怕的设计愚蠢,但是现在我不允许更改笨拙的行为。

c++ winapi string-literals
4个回答
3
投票

您可以添加其他重载,这将更适合字符串文字。这不是真正的science,而只是启发式:

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

另一个想法是利用文字确实是arrays >>:

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

请注意,它们并没有完全检测到literal

not notliteral,而是其他一些功能。 const char* p = createANewString(); f(p);将解析为f(const char*)const char x[] = { 'A', 'b', 'c', '\0' };将解析为模板。它们都不是literals,但是您可能都不希望对其进行任何修改。

一旦进行了更改,应该很容易找出每个重载在哪里被调用。

这全部的前提是,如果主函数在内部对其进行修改,则主函数不应将其作为const char*,并且面临的问题是,由于向后兼容,编译器允许调用带有以下参数的函数:指向带有文字的非常量的指针...


1
投票

我认为没有一种方法可以在不使用某些黑客的情况下检测到至少。


0
投票

VirtualQuery可用于检测地址是否可写,只读或不可访问。检查返回的VirtualQuery结构的StateProtect成员,以查看内存是否可访问并具有所需的访问权限。


0
投票

一种非常不可靠的方法涉及检查指针是否在.rdata段中。

© www.soinside.com 2019 - 2024. All rights reserved.