这是一个gdb错误吗?

时间:2012-06-11 09:56:51

标签: c++ string gdb

 1 #include "string"
 2 using namespace std;
 3 
 4 bool m_bInited = true;
 5 int  m_imaxsize = 100;
 6 
 7 int test()
 8 {
 9     if (!m_bInited)
10     {
11         return -1;
12     }
13 
14     std::string gbkInput = "";
15     std::string utf8Input = "";
16     if (gbkInput.size() > m_imaxsize)
17     {
18         return 1;
19     }
20     return 0;
21 }
22 
23 int main()
24 {
25     test();
26     return 0;
27 }

从第16行使用gdb步骤时,调试顺序为:

第16行 - >第20行 - >第18行 - >第21行。

    (gdb) b 16
    (gdb) r
    Breakpoint 1, test () at main.cpp:16
    16          if (gbkInput.size() > m_imaxsize)
    (gdb) n
    20          return 0;
    (gdb) n
    18              return 1;
    (gdb) n
    21      }

编译:g ++ -g main.cpp -o test

为什么gdb显示第18行?并且test()返回值为0.

我的gcc版本是4.1.2。 GNU gdb Fedora(6.8-37.el5)或GNU gdb(GDB)Red Hat Enterprise Linux(7.0.1-37.el5)。 两个gdb版本都有这个问题。

BTW:如果将第14行,第15行(这2个字符串var)移动到第9行,它就可以了。 gdb不会显示第18行! 似乎字符串var导致了这个错误。

每个人都可以帮助我吗? 谢谢!

1 个答案:

答案 0 :(得分:4)

此行为是旧版gcc / gdb的“功能”,之前已在此处报告过:gdb unexpected behavior: in nested if。注意:由于没有令人满意的解决方案,因此不能将此问题标记为其他问题的副本。

该声明未被执行。它只是看起来像。

<强>附录
很容易验证语句没有被执行。添加功能

int one() {
   return 1;
}

然后将return 1;替换为return one(); gdb将打印return one();,但不会调用函数one()。显然在旧版本的gdb中存在一个问题,它在if语句中显示了close括号的执行。

请注意:这只发生在旧版本的gdb中,显然是显示问题,而不是程序执行错误。