在C中,字符串文字的类型是char []。
gdb调试器:
(gdb) ptype ""
type = char [1]
(gdb) ptype "abc"
type = char [4]lldb调试器:
(lldb) p ""
(const char [1]) $0 = ""
(lldb) p "abc"
(const char [4]) $1 = "abc"gdb调试器将字符串文本的类型显示为char [N] (按照语言标准),但lldb调试器在字符串文本类型- const char [N]中显示const类型限定符。
这是lldb调试器中的一个bug吗?还是,我漏掉了什么?
发布于 2022-08-13 06:01:47
这是因为lldb调试器在计算给定给print命令的表达式时使用了ISO C++规则/规范,而在C++中,普通字符串文字的类型是const char[N],其中N是包含null终止符的字符串的大小。
lldb调试器使用ISO C++规则/规范的证明:
假设C程序有一个变量定义:
int x;使用lldb调试器调试此程序时,如果我这样做了:
(lldb) p sizeof (*(void *)&x)
error: expression failed to parse:
warning: <user expression 4>:1:9: ISO C++ does not allow indirection on operand of type 'void *'
sizeof (*(void *)&x)
^~~~~~~~~~~
error: <user expression 4>:1:8: invalid application of 'sizeof' to an incomplete type 'void'
sizeof (*(void *)&x)
^~~~~~~~~~~~~在错误中,上面写着ISO C++ ..。
这证明了lldb调试器使用C++语言规则/规范来计算给print命令的表达式。因此,lldb调试器在命令p "abc"的输出中显示const char [4]类型。
补充:
在gdb调试器中,我们可以使用set language命令设置当前的源语言:
(gdb) show language
The current source language is "auto; currently c".
(gdb) set language c++
Warning: the current language does not match this frame.
(gdb) show language
The current source language is "c++".
Warning: the current language does not match this frame.
(gdb) ptype "abc"
type = char [4]即使在将language设置为c++之后,输出仍显示type为char [4]。这可能是因为set language命令只设置当前的源语言,但是在计算给print命令的表达式时,它可能使用C语言规则。
在调试期间,我没有在lldb调试器中找到任何类似的设置/重置源代码语言的方法。
发布于 2021-12-31 15:23:04
字符串文字是,不是可修改的(实际上可以放在只读内存(如.rodata)中。如果程序试图修改由字符串文字形成的静态数组,则行为是未定义的。
lldb只是显示了引擎盖下的真正内存的类型,尽管它可以通过指向const的指针正式到达。
https://stackoverflow.com/questions/70543494
复制相似问题