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

Fortran 如何跟踪潜在的未定义行为情况?,fortran,Fortran,当指针关联时,我在释放时得到一个双重自由错误。我怀疑一些未定义的行为正在发生,但我不知道从哪里开始寻找,或者如何寻找。如何追踪未定义的行为 编译器是英特尔12。我不能发布代码,因为它太大了,我甚至不确定问题的根源在我的代码中。它可能在同事的图书馆里。我试着用gdb进行一些调试,但我没有走多远。这就是错误所在 malloc:*对象0x102302f20的错误:未分配要释放的指针 *在malloc\u error\u break中设置断点以进行调试 紧靠这一行的是一个print*,关联指针,它将打印

当指针关联时,我在释放时得到一个双重自由错误。我怀疑一些未定义的行为正在发生,但我不知道从哪里开始寻找,或者如何寻找。如何追踪未定义的行为

编译器是英特尔12。我不能发布代码,因为它太大了,我甚至不确定问题的根源在我的代码中。它可能在同事的图书馆里。我试着用gdb进行一些调试,但我没有走多远。这就是错误所在

malloc:*对象0x102302f20的错误:未分配要释放的指针 *在malloc\u error\u 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)

长篇大论,可能会指向抱歉,无法抗拒回答

迂腐的说,编译器的最佳猜测似乎是“释放的指针未分配”。但在Fortran中,指针只有未定义、关联和解除关联的状态,因此,编译器链接到可执行文件的系统函数调用可能会产生错误消息

话虽如此,我希望:

目标超出范围,而指向它的指针仍在范围内。Fortran 2003标准说明了注释16.13

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

同一文档还声明,传递给关联内在函数的指针的关联状态不应是未定义的,因此程序可能允许撒谎并告诉您associatedundefined_pointer=.true

通过超出范围或由于解除分配调用而解除分配的可分配目标。 指针在声明时为null,例如real,pointer::rptr=>null这通常被认为是一件好事,您可能需要确保代码符合。 指针在关联之前被置空,尽管根据标准我不认为置空指针为空是错误的。 指针指向指针。 您报告的错误消息倾向于表明模块变量超出范围,但是,正如您已经观察到的,很难确定


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

长篇大论,可能会指向抱歉,无法拒绝回答

迂腐的说,编译器的最佳猜测似乎是“释放的指针未分配”。但在Fortran中,指针只有未定义、关联和解除关联的状态,因此,编译器链接到可执行文件的系统函数调用可能会产生错误消息

话虽如此,我希望:

目标超出范围,而指向它的指针仍在范围内。Fortran 2003标准说明了注释16.13

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

同一文档还声明,传递给关联内在函数的指针的关联状态不应是未定义的,因此程序可能允许撒谎并告诉您associatedundefined_pointer=.true

通过超出范围或由于解除分配调用而解除分配的可分配目标。 指针在声明时为null,例如real,pointer::rptr=>null这通常被认为是一件好事,您可能需要确保代码符合。 指针在关联之前被置空, 尽管根据标准,我不认为将空指针置零是一个错误。 指针指向指针。 您报告的错误消息倾向于表明模块变量超出范围,但是,正如您已经观察到的,很难确定


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

困难重重!也许还有调试器。能给我们看一下代码和错误信息吗,你用的是什么编译器,常用的东西吗?是的,我正在做。我发了两次帖子,所以我在队列上受到了双重打击。你试过valgrind了吗?@a.out?@Zhenya:我不指望它会产生任何有意义的结果,只是因为代码编写的方式太糟糕而产生了巨大的回溯。任何信号都会被淹没。我已经遇到了困难!也许还有调试器。能给我们看一下代码和错误信息吗,你用的是什么编译器,常用的东西吗?是的,我正在做。我发了两次帖子,所以我在队列上受到了双重打击。你试过valgrind了吗?@a.out?@Zhenya:我不指望它会产生任何有意义的结果,只是因为代码编写的方式太糟糕而产生了巨大的回溯。任何信号都会被淹没。我已经去过那里了