需要一种有效的策略来删除编译器为局部变量强加的SAVE属性

时间:2014-08-21 22:15:24

标签: fortran

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

我正在处理大约90,000行代码(超过500个函数和子程序),我面临一些不吸引人的选择:

非常繁琐的保守方法

我可以禁用编译器标志并将SAVE指令全局添加到每个例程的声明头中(跳过我声明为PUREELEMENTAL的任何例程),然后迭代删除它来自例程,重建和测试代码,并在测试失败时恢复它。这保证会起作用,但它似乎是浪费时间的大量而不浪费。

稍微繁琐的添加方法

我可以禁用编译器标志,然后迭代地将SAVE添加到可疑例程,重建和测试,并在代码成功运行后停止。这不那么乏味,但仍然相当浪费。更糟糕的是,如果代码测试未涵盖需要保存状态的每个场景,则无法保证工作。

问题

是否有更有效的方法来检测例程中的已保存状态?这是静态分析工具的工作吗?还是我注定了人工编辑和测试的无穷无尽的烦恼?

(一个自然的问题是“为什么要这么麻烦?”三个原因:首先,它是不好的编码实践;状态应该保存在全局,模块或对象级别,而不是在特定的例程中。第二,实际上,本地保存状态会干扰代码并行化。最后,最小化编译器标志会降低代码对特定编译器的依赖性,并从构建过程中删除隐藏状态。)

1 个答案:

答案 0 :(得分:1)

我同意你的意见,你正在做的事情是正确的事情(TM),但我没有任何解决方案可以保证它不会变得单调乏味。在任何情况下,为了摆脱大量保存的状态,不仅仅是将它从编译器选项移动到代码中,可能还需要对代码进行或多或少的广泛重构。

无论如何,值得一试的是在valgrind下运行你的代码。如果没有这样的全局-save选项,valgrind可能会使用未初始化的变量"错误。