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

C++ 确定const char*是字符串文字还是变量,c++,winapi,string-literals,C++,Winapi,String Literals,如果传递给函数的参数(const char*argument)是常量文字还是变量,有没有简单的方法可以检测 我正在尝试修复一些代码中的错误,这些代码充满了IsBadWritePtr调用,如果参数是常量文本,就会抛出访问冲突异常 这是一个可怕的设计愚蠢,但现在我不允许改变尴尬的行为 我认为没有一种方法可以检测到这一点,至少在不使用黑客的情况下是如此。 由于接口采用const char*,因此函数的职责是无论如何不修改传递的字符串。您需要修改实现,因为它根本不正确。我认为没有办法检测到这一点,至少在

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

我正在尝试修复一些代码中的错误,这些代码充满了IsBadWritePtr调用,如果参数是常量文本,就会抛出访问冲突异常

这是一个可怕的设计愚蠢,但现在我不允许改变尴尬的行为

我认为没有一种方法可以检测到这一点,至少在不使用黑客的情况下是如此。
由于接口采用
const char*
,因此函数的职责是无论如何不修改传递的字符串。您需要修改实现,因为它根本不正确。

我认为没有办法检测到这一点,至少在不使用黑客的情况下。

由于接口采用
const char*
,因此函数的职责是无论如何不修改传递的字符串。您需要修改实现,因为它根本不正确。

您可以添加不同的重载,以便更好地匹配字符串文本。这不是真正的科学,只是试探法:

void f(const char* p); // potential literal
void f(char *p);       // pointer to non-const
另一个想法是利用文字实际上是数组:

模板
void f(常量字符(&u)[N]);//潜在文字
请注意,它们并不完全检测文字与非文字,而是检测一些其他特性<代码>常量字符*p=createANewString();f(p)将解析为
f(const char*)
,和
const char x[]={'A','b','c','\0'}将解析为模板。它们都不是文字,但您可能不想修改它们

一旦进行了更改,就应该很容易找到调用每个重载的位置


这一切都是在这样一个前提下进行的,即如果主函数在内部修改参数,则不应将参数视为
const char*
,您面临的问题是,为了向后兼容,您的编译器允许调用一个函数,该函数将指针指向非常量,并带有一个文本…

您可以添加一个不同的重载,它将更好地匹配字符串文本。这不是真正的科学,只是试探法:

void f(const char* p); // potential literal
void f(char *p);       // pointer to non-const
另一个想法是利用文字实际上是数组:

模板
void f(常量字符(&u)[N]);//潜在文字
请注意,它们并不完全检测文字与非文字,而是检测一些其他特性<代码>常量字符*p=createANewString();f(p)
将解析为
f(const char*)
,和
const char x[]={'A','b','c','\0'}将解析为模板。它们都不是文字,但您可能不想修改它们

一旦进行了更改,就应该很容易找到调用每个重载的位置


这一切都是在这样一个前提下进行的,即如果主函数在内部修改参数,则不应将参数视为
const char*
,您所面临的问题是,为了向后兼容,您的编译器允许调用一个函数,该函数使用指向非常量的指针和一个文本…

可以用来检测地址是可写的、只读的还是不可访问的。检查返回的
内存基本信息
结构的
状态
保护
成员,查看内存是否可访问以及是否具有所需的访问权限。

可用于检测地址是否可写、只读或不可访问。检查返回的
MEMORY\u BASIC\u INFORMATION
结构的
状态
保护
成员,以查看内存是否可访问,以及是否具有所需的访问权限。

一种非常粗俗的方法是检查指针是否位于.rdata段中


在生成后使用
dumpbin/headers
检索.rdata节的偏移量和长度,或者自己解析PE头。当然,这是特定于工具链的,通常是一个坏主意。此外,如果代码需要与DLL进行互操作,则必须检查多个可执行文件和多个.rdata段。

一种非常粗俗的方法是检查指针是否位于.rdata段


在生成后使用
dumpbin/headers
检索.rdata节的偏移量和长度,或者自己解析PE头。当然,这是特定于工具链的,通常是一个坏主意。此外,如果代码需要与DLL进行互操作,则必须检查多个可执行文件和多个.rdata段。

我不明白这有什么关系。无论是否由字符串文字创建,都可以将指向
const char
数组第一个元素的指针视为完全相同的对象。@sftrabbit我想可能存在两个问题:它是以null结尾的字符串吗?它是指向单个
字符的指针吗?@MM.:说什么????文字不是临时的。它是最不临时的对象类型,因为它的寿命是整个程序的寿命。我不知道它是否有任何合理的用途,但这是一个很好的问题!你可以在工作中传递这篇文章,看看它是否有帮助:。我不明白为什么它会很重要。无论是否由字符串文字创建,都可以将指向
const char
数组第一个元素的指针视为完全相同的对象。@sftrabbit我想可能存在两个问题:它是以null结尾的字符串吗?它是指向单个
字符的指针吗?@MM.:说什么????文字不是临时的。它是最不临时的对象类型,因为它的寿命是整个程序的寿命。我不知道它是否有任何合理的用途,但这是一个很好的问题!您可以在工作中传递这篇文章,看看它是否有用:。