1

实际上,我真正的问题是:以下代码中的指示行有什么问题吗(“Causes SIGABRT”):

char* myFunc(char *param) {
  char* leaked = new char[80]; // Intentionally leaked
  if (param == NULL) throw logic_error("Parameter was null!"); // Causes SIGABRT
  strcpy(leaked, param);
  // Missing return, but never gets this far, so should be okay.
}

void test_non_happy_myFunc()
{
  try {
    myFunc(NULL);
  } catch (logic_error&) {
    cout << "Test succeeded!" << endl;
    return;
  }

  cout << "Test FAILED!" << endl;
}

int main()
{
  test_non_happy_myFunc();
}

我试图提出一个最小的测试用例发送给 IBM/Rational,以证明他们的 purify 软件存在问题,所以我首先由 SO 社区运行它。是的,我故意在第二行泄漏内存,是的,我知道当抛出异常时指针“泄漏”是统一化的。

上面的代码在使用 g++ 编译时在 purify 外部正常运行,但在 purify 内部运行时会导致核心转储。我在上面的代码中犯了一个新手错误(使 SIGABRT 成为我的错),还是我可以将矛头指向 IBM/Rational Purify?

编辑:(澄清)

不用purify在命令行运行,上面完整的程序打印:

Test succeeded!

在purify里面运行,净化报告:

COR: Fatal core dump
This is occurring while in thread 1299:
        _p450static    [rtlib.o]
        abort          [libc.so.6]
        uw_init_context_1 [unwind-dw2.c:1256]
        _Unwind_RaiseException [unwind.inc:88]
        __cxa_throw    [eh_throw.cc:78]
        myFunc(char*)  [exception_test.cc:9]
        test_non_happy_myFunc() [exception_test.cc:17]
        main           [exception_test.cc:28]

请注意,在先决条件包括等之后,第 9 行最终成为我指出的行。

4

1 回答 1

1

除了 myFunc 中缺少 return 语句之外,我在上面的代码中看不到任何错误。然而,在将责任归咎于其他人的代码(特别是广泛使用的代码)之前,我会仔细检查在此之前没有发生任何不好的事情(如你所知,如果某事召唤 UB 守护进程一百万条执行指令之前可能仍然有可能只有现在才会有可见效果)。

仅当仅使用 main 调用test_non_happy_myFunc且没有像自定义全局分配器之类的花哨的东西来编译显示的代码仍然显示问题时,我才会将搜索移至您的工具(即纯度,编译器等),并且在成为之前我不会停止100%肯定问题就在那里。

于 2011-02-02T20:34:11.197 回答