Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最终程序出现问题(gfortran的segfault)_Fortran_Gfortran_Finalizer - Fatal编程技术网

最终程序出现问题(gfortran的segfault)

最终程序出现问题(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中的一个问题,它是 在您的情况下,您有一个可用的解决方

考虑以下小程序,它再现了我在gfortran gcc 9.2.0 for mac os中遇到的分段错误:


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