自动检查列宽是否超过 72
Automatically check for column width beyond 72
所以我有点继承了这个用 Fortran 编写的(不是真正的遗留)项目。为了使其线程安全,我必须将一个 void*
指针(称为 user_data
,您可能知道该模式)传递给所有 Fortran 例程,以便它们可以将其传递回回调(因此是全局的)状态现在已正确分配堆)。
令我由衷惊讶的是,这导致在最奇怪的地方出现完全崩溃和段错误。毕竟,我只是向所有函数添加了一个不变的参数?
令我震惊的是(我不是 Fortran 程序员,只是一个有解决问题诀窍的普通黑客),我了解到 Fortran 编译器会简单地忽略第 72 列以外的所有内容,可能是因为列很昂贵或其他原因,甚至没有发出警告(好吧,除了某些情况下 "type error"(哈哈,Fortran 中的类型纪律,真是个笑话)被报告了)。
直到今天,我一直在代码中寻找遭受这种缩进的意外后果的地方。
是否有任何工具可以可靠地检查 Fortran 代码库是否存在此类错误?
并且,作为献给 John Oliver 的额外问题:为什么 72 列限制仍然存在?
Is there any tool out there that can check a Fortran codebase reliably for this kind of mistake?
是的,你的编译器。对于 gfortran
,这将是 -Wline-truncation
(包含在 -Wall
中,这是您始终应该佩戴的东西)。对于 ifort
,这将是 -warn truncated_source
。我敢打赌(几乎)任何其他编译器也有这方面的选择。
72 列的限制是历史上从穿孔卡片发展而来的,并为向后兼容而保留。对于大多数编译器,您可以更改甚至禁用此限制。使用 gfortran
这将是 -ffixed-line-length-<n>
和整数 <n>
和 -ffixed-line-length-0
来禁用它。
所以我有点继承了这个用 Fortran 编写的(不是真正的遗留)项目。为了使其线程安全,我必须将一个 void*
指针(称为 user_data
,您可能知道该模式)传递给所有 Fortran 例程,以便它们可以将其传递回回调(因此是全局的)状态现在已正确分配堆)。
令我由衷惊讶的是,这导致在最奇怪的地方出现完全崩溃和段错误。毕竟,我只是向所有函数添加了一个不变的参数?
令我震惊的是(我不是 Fortran 程序员,只是一个有解决问题诀窍的普通黑客),我了解到 Fortran 编译器会简单地忽略第 72 列以外的所有内容,可能是因为列很昂贵或其他原因,甚至没有发出警告(好吧,除了某些情况下 "type error"(哈哈,Fortran 中的类型纪律,真是个笑话)被报告了)。
直到今天,我一直在代码中寻找遭受这种缩进的意外后果的地方。
是否有任何工具可以可靠地检查 Fortran 代码库是否存在此类错误?
并且,作为献给 John Oliver 的额外问题:为什么 72 列限制仍然存在?
Is there any tool out there that can check a Fortran codebase reliably for this kind of mistake?
是的,你的编译器。对于 gfortran
,这将是 -Wline-truncation
(包含在 -Wall
中,这是您始终应该佩戴的东西)。对于 ifort
,这将是 -warn truncated_source
。我敢打赌(几乎)任何其他编译器也有这方面的选择。
72 列的限制是历史上从穿孔卡片发展而来的,并为向后兼容而保留。对于大多数编译器,您可以更改甚至禁用此限制。使用 gfortran
这将是 -ffixed-line-length-<n>
和整数 <n>
和 -ffixed-line-length-0
来禁用它。