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
Fortran 需要一个有效的策略来删除编译器为局部变量设置的SAVE属性吗_Fortran - Fatal编程技术网

Fortran 需要一个有效的策略来删除编译器为局部变量设置的SAVE属性吗

Fortran 需要一个有效的策略来删除编译器为局部变量设置的SAVE属性吗,fortran,Fortran,作为代码现代化工作的一部分,我试图消除函数和子例程中保存的状态。除非使用“所有变量保存”标志(如英特尔编译器下的/SAVE或-SAVE)生成相关代码,否则该代码将失败 我正在处理大约90000行代码(超过500个函数和子例程),我面临着一些没有吸引力的选项: 极其乏味的保守方法 我可以禁用编译器标志并全局地将SAVE指令添加到每个例程的声明头中(跳过我声明为PURE或ELEMENTAL的任何例程),然后迭代地从例程中删除它,重建和测试代码,并在测试失败时恢复它。这是保证工作,但它似乎是一个巨大的

作为代码现代化工作的一部分,我试图消除函数和子例程中保存的状态。除非使用“所有变量保存”标志(如英特尔编译器下的
/SAVE
-SAVE
)生成相关代码,否则该代码将失败

我正在处理大约90000行代码(超过500个函数和子例程),我面临着一些没有吸引力的选项:

极其乏味的保守方法 我可以禁用编译器标志并全局地将
SAVE
指令添加到每个例程的声明头中(跳过我声明为
PURE
ELEMENTAL
的任何例程),然后迭代地从例程中删除它,重建和测试代码,并在测试失败时恢复它。这是保证工作,但它似乎是一个巨大的和不雅的浪费时间

稍微不那么乏味的加法方法 我可以禁用编译器标志,然后迭代地将
SAVE
添加到可疑例程中,重建和测试,并在代码成功运行后停止。这虽然不那么乏味,但仍然相当浪费。更糟糕的是,如果代码测试没有覆盖所有需要保存状态的场景,那么它就不能保证工作

问题 是否有更有效的方法来检测例程中保存的状态?这是静态分析工具的工作吗?还是我注定要面对无休止的手工编辑和测试的单调乏味


(一个自然的问题是“为什么要麻烦?”原因有三:首先,这是一种糟糕的编码实践;状态应该保存在全局、模块或对象级别,而不是保存在特定的例程中。其次,实际上,本地保存的状态会干扰代码的并行化。最后,最小化编译器标志会减少代码对特定编译器的依赖性,并从buil中删除隐藏状态我同意你的观点,你所做的是正确的(TM),但我没有任何解决方案可以保证它不会单调乏味。在任何情况下,为了摆脱大量保存的状态,而不仅仅是将其从编译器选项移动到代码中,可能需要或多或少地对代码进行重构


无论如何,值得一试的是在valgrind下运行代码。如果没有这样的全局保存选项,valgrind可能会捕获一些“使用未初始化变量”错误。

如果您不打算实际处理代码,并且不需要将其移植到不支持
-save
选项的编译器,那么您想做的事情听起来很糟糕,因为它可能会引入依赖已保存变量的函数所没有的bug。你永远不会明白所有这些。您给出的更改代码的原因不足以保证引入(新)错误。如果代码处于只修复错误模式,我可能同意您的看法。代码正在积极开发中,我认为隐藏状态的问题非常严重,需要消除。我对在重构过程中引入/发现bug的风险感到满意。是的,这就是我的意思,但是在这种情况下,进行主动开发的人不能在他们改变事情的过程中逐个处理它吗?如果代码库有未来,那么你将不得不在某个阶段沿着这条道路前进。我认为静态和动态正确性工具对于这类任务非常重要,无论您采用何种方法。代码有两个开发人员,我是其中之一,因此没有人可以将此任务委托给他们。:)根据你的建议,我将继续使用valgrind作为保存状态检测器。一个问题是,我不确定哪个“未初始化变量”消息是有意义的。解决方案是构建一个玩具“保存状态”程序,用-save和-unout编译它,然后通过valgrind运行这两个程序来查看弹出的消息。我可能采取的另一种方法是比较反汇编代码并寻找模式。令人毛骨悚然但可能硕果累累。