最终程序出现问题(gfortran的segfault)
考虑以下小程序,它再现了我在gfortran gcc 9.2.0 for mac os中遇到的分段错误:最终程序出现问题(gfortran的segfault),fortran,gfortran,finalizer,Fortran,Gfortran,Finalizer,考虑以下小程序,它再现了我在gfortran gcc 9.2.0 for mac os中遇到的分段错误: segfault仅在解除分配静态\u t类型的数组时发生,该数组具有str\u t类型的显式数组成员。奇怪的是,它似乎与str_t DT的最终方法有关(当我删除此过程时,问题就消失了),但我看不出原因。这看起来确实像是最终子例程的问题,毕竟删除最终子例程会消除分段错误。然而,这是gfortran中更广泛问题的一个例子 对于gfortran中的一个问题,它是 在您的情况下,您有一个可用的解决方
segfault仅在解除分配静态\u t类型的数组时发生,该数组具有str\u t类型的显式数组成员。奇怪的是,它似乎与str_t DT的最终方法有关(当我删除此过程时,问题就消失了),但我看不出原因。这看起来确实像是最终子例程的问题,毕竟删除最终子例程会消除分段错误。然而,这是gfortran中更广泛问题的一个例子 对于gfortran中的一个问题,它是 在您的情况下,您有一个可用的解决方法:删除在任何时候都没有实际调用的最终子例程。在更一般的情况下,这可能不是一种选择。无论如何,要做的事情就是向GCC维护人员报告这个bug(特别是如果您可以使用更高版本的编译器进行测试的话) 为什么我说这是一个更广泛的问题的一部分?让我们来看看如何简化代码:
type :: str_t
character, allocatable :: s
end type str_t
type :: dynamic_t
type(str_t), allocatable :: expr
end type dynamic_t
type(dynamic_t), allocatable :: dyna
allocate(dyna)
allocate(dyna%expr)
end
或
两者都没有最终定稿,但在运行时(对我来说)都存在分段错误
如果您想查看问题程序与此答案之间的联系:关键在于组件
s
的延迟长度特性。作为一个显式长度(可分配)标量组件,上面的示例在有或没有终结的情况下崩溃;由于延迟长度组件的最终确定控制了崩溃。首先我要发表评论,但我不是一个普通用户,所以我的代表不在那里。我有一个惊人的相似问题,我很欣赏这个预煮的例子,它似乎与gcc 5.4一起工作,解释了这个警告:
- 默认标志,-O1,-O2全部失败
- -Og和-O3均按预期工作
显然,这不是你想写代码的东西,而是想传达我的经验,如果你提交了一个bug报告,这可能对他们很有用。我在使用gcc 9.2.1的Ubuntu笔记本电脑上也有同样的行为。由于此程序中没有调用最终的子例程,第一个猜测是您的编译器很顽皮。这两个示例都是使用gfortran 10.0.0 2019122编译和执行的。(我使用9.1而不是后来的9或trunk进行了测试)。谢谢,很有趣(但有点令人担忧!)。我还没有访问GCC10的权限,我希望它能被修复。@francescalus,OP的代码未能最终确定。有一些关于最终确定的gfortran错误报告。不幸的是,gfortran最近失去了一些开发人员。@evets、OP的示例和我的两个示例在我的系统上出现了“10.0.1 20200125”失败。提供哪些有用的细节?(感谢您的更新,但听到开发者流失的消息不太好。)
type :: str_t
character, allocatable :: s
end type str_t
type :: dynamic_t
type(str_t), allocatable :: expr
end type dynamic_t
type(dynamic_t), allocatable :: dyna
allocate(dyna)
allocate(dyna%expr)
end
implicit none
type :: str_t
character, allocatable :: s
end type str_t
type :: static_t
type(str_t) :: expr
end type static_t
type(static_t), allocatable :: stat
allocate(stat)
end