sizeof引用gdb中的数组

时间:2014-03-07 16:47:17

标签: c++ reference gdb

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

编译,启动gdb并在return上放置断点。如果您键入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中的错误?

1 个答案:

答案 0 :(得分: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-04-14。我仍然看到gdb 7.7.1中的错误,但它已在7.11.1中修复。