作为代码现代化工作的一部分,我试图消除函数和子例程中保存的状态。除非使用“所有变量保存”标志(例如英特尔编译器下的/SAVE
或-save
)构建,否则有问题的代码将失败。
我正在处理大约90,000行代码(超过500个函数和子程序),我面临一些不吸引人的选择:
我可以禁用编译器标志并将SAVE
指令全局添加到每个例程的声明头中(跳过我声明为PURE
或ELEMENTAL
的任何例程),然后迭代删除它来自例程,重建和测试代码,并在测试失败时恢复它。这保证会起作用,但它似乎是浪费时间的大量而不浪费。
我可以禁用编译器标志,然后迭代地将SAVE
添加到可疑例程,重建和测试,并在代码成功运行后停止。这不那么乏味,但仍然相当浪费。更糟糕的是,如果代码测试未涵盖需要保存状态的每个场景,则无法保证工作。
是否有更有效的方法来检测例程中的已保存状态?这是静态分析工具的工作吗?还是我注定了人工编辑和测试的无穷无尽的烦恼?
(一个自然的问题是“为什么要这么麻烦?”三个原因:首先,它是不好的编码实践;状态应该保存在全局,模块或对象级别,而不是在特定的例程中。第二,实际上,本地保存状态会干扰代码并行化。最后,最小化编译器标志会降低代码对特定编译器的依赖性,并从构建过程中删除隐藏状态。)
答案 0 :(得分:1)
我同意你的意见,你正在做的事情是正确的事情(TM),但我没有任何解决方案可以保证它不会变得单调乏味。在任何情况下,为了摆脱大量保存的状态,不仅仅是将它从编译器选项移动到代码中,可能还需要对代码进行或多或少的广泛重构。
无论如何,值得一试的是在valgrind下运行你的代码。如果没有这样的全局-save选项,valgrind可能会使用未初始化的变量"错误。