如何跟踪潜在的未定义行为情况?

时间:2012-07-06 14:18:42

标签: fortran

当指针关联时,我在deallocate上得到双重自由错误。我怀疑一些未定义的行为正在进行中,但我不知道从哪里开始寻找它,或者如何。你如何追踪未定义的行为?

编译器是intel 12.我无法发布代码,因为它很庞大,我甚至不确定问题的根源是否在我的代码中。它可能在同事的图书馆。我试着用gdb做一些调试,但是我没有走得太远。这是错误。

malloc: *对象0x102302f20的错误:未分配被释放的指针 * 在malloc_error_break中设置断点以进行调试

紧接在此之前的行是print *,关联(指针),它打印为true。

这是回溯

#0  0x00007fff9327b6c0 in malloc_error_break ()
#1  0x00007fff9327b805 in free ()
#2  0x0000000100d27470 in for_dealloc_allocatable ()
#3  0x0000000100506699 in sharedarraysmodule_mp_deleterealsharedarray2_ () at SharedArrays.f90:609
#4  0x00000001003bbc4e in gammaaggregatormodule_mp_deleteprivate_ () at GammaAggregator.f90:86
#5  0x0000000102300bc0 in ?? ()
Previous frame inner to this frame (gdb could not unwind past this frame)

1 个答案:

答案 0 :(得分:4)

长篇评论,可能会指出(抱歉,无法抗拒)回答......

要迂腐,看起来好像你的编译器最好的猜测是'未被分配的指针被释放'。但是在Fortran指针中只有状态undefinedassociateddisassociated,因此错误消息可能源于对编译器链接到可执行文件的系统函数的调用。

话虽如此,我会寻找:

  • 目标超出范围,而指向它的指针仍在范围内。 Fortran 2003标准规定(注16.13)

    可以通过使用关联在子程序中访问来自模块程序单元的指针。 这样的指针的生命周期大于子程序中声明的目标, 除非保存这些目标。因此,如果这样的指针与本地目标相关联,则存在 当子程序定义的过程完成执行时,目标的可能性 将停止存在,指针“悬空”。这个标准考虑了这样的指针 未定义的关联状态。它们既不相关也不相关。他们不应该 在程序中再次使用,直到它们的状态重新建立。 a没有要求 处理器能够检测指针目标何时不复存在。

同一文档还指出传递给associated内在的指针的关联状态不应该是未定义的所以它可能允许程序撒谎并告诉你{{ 1}}。

  • 通过超出范围或作为associated(undefined_pointer)==.true.调用的结果,可以释放可分配的目标。
  • 指针在声明时无效,例如deallocate()(这通常被视为一件好事,您可能希望确保您的代码符合要求)。
  • 指针在关联之前无效,但我不认为根据标准取消空指针是错误。
  • 指针指针。

您报告的错误消息往往表明您有一些模块变量超出范围,但正如您已经观察到的那样,很难确定。

如果这没有帮助,请联系英特尔技术支持,我发现它们非常有用,他们非常擅长发现一个代码中的问题。