在gdb中,sizeof引用数组是什么意思?

4
int main()
{
    typedef unsigned char a4[4];
    a4 p1;
    a4& p2 = p1;
    p2[1]=1;
    cout<<sizeof(p2);
    return p2[1];
}

编译后,在return上设置断点并启动gdb。如果您在gdb中键入p sizeof(p2),则gdb将打印8,而如果您启动程序,则会打印4。如果您在gdb中输入p sizeof(*p2),则输出为4(数组的大小)。我认为这是因为gdb将p2视为指针(引用在幕后实现为指针)。在GCC 4.8.2和Clang 4.3编译器上测试,运行在GDB 7.7 linux arch.,ubuntu 13.10上。这是正确的还是gdb的一个错误?

有趣。听起来像是一个“bug”。不过你应该提供版本和平台信息。 - Lightness Races in Orbit
您可以通过gdb bugzilla提交错误报告,或者如果您愿意,我可以代为提交(并包含此问题的链接)。 - Keith Thompson
我做到了,感谢大家的帮助。https://sourceware.org/bugzilla/show_bug.cgi?id=16675 如果有更好的描述建议,我将不胜感激。 - Vladimir Yanakiev
1个回答

4
这是您程序的修改版。我将数组大小从4更改为17,以确保其大小与其他任何内容有所区别。我还更改了类型和变量名称,使代码更易于理解,并添加了#include <iostream>,以便它可以编译。我还删除了一些不必要的内容。
#include <iostream>
int main()
{
    typedef unsigned char char17[17];
    char17 arr17;
    char17& arr17_ref = arr17;
    std::cout << "sizeof(arr17) = "
              << sizeof arr17
              << ", sizeof(arr17_ref) = "
              << sizeof(arr17_ref)
              << "\n";
    return 0;
}

当我在我的系统上编译并运行它时,输出为17
当我在gdb下运行它时,我得到了8(我的系统上指针的大小):
$ gdb ./c
GNU gdb (GDB) 7.5-ubuntu
[snip]
Reading symbols from /home/kst/c...done.
(gdb) b 12
Breakpoint 1 at 0x40097e: file c.cpp, line 12.
(gdb) r
Starting program: /home/kst/c 
sizeof(arr17) = 17, sizeof(arr17_ref) = 17

Breakpoint 1, main () at c.cpp:12
12          return 0;
(gdb) p sizeof(arr17)
$1 = 17
(gdb) p sizeof(arr17_ref)
$2 = 8
(gdb) c
Continuing.
[Inferior 1 (process 23420) exited normally]
(gdb) q
$ 

是的,这是gdb中的一个错误。gdb应该按照程序运行时的方式来评估表达式;在这种情况下,它未能这样做。(我正在Linux Mint 14上使用gcc 4.7.2和gdb 7.5。)
更新:
OP提交了一个错误报告: https://sourceware.org/bugzilla/show_bug.cgi?id=16675,并已经修复。补丁已获批准,并于2014年4月14日提交。我仍然在gdb 7.7.1中看到这个bug,但在7.11.1中已经修复。

这里也一样(Fedora 20,gcc-4.8.2-7.fc20.x86_64,gdb-7.6.50.20130731-19.fc20.x86_64)。 - vonbrand
在 Arch Linux 上确认,使用 gdb 7.7。使用 g++ 4.8.2 20140206(预发布版)编译。 - mcmlxxxvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接