我最近从一个刚刚退休的人那里继承了一个用托管C ++编写的程序。花了一些时间挖掘它之后,我可以诚实地说至少95%的它属于thedailywtf。但是,我现在的任务是修改它并将其移植到我熟悉的语言中。
程序本身会从文件中读取许多参数(50+)并执行一系列计算并吐出报告。一旦我完成了3个字母变量的页面(其中许多重复用于完全不相关的目的),我需要想出一种方法来测试我的代码,以确保它提供与之前相同的答案代码。
这很可能是一厢情愿的想法,但有没有任何自动代码分析工具可以帮助我以任何方式或形式完成这项任务?
我将把它移植到Java。
答案 0 :(得分:2)
我认为你应该开始编写测试,以确保移植的代码不会破坏任何现有报告的行为。
对于自动代码分析工具,最有可能在这方面为您提供帮助的工具是数据流分析工具,它可以假设模拟从文件到变量和报告的数据流。不幸的是,对我来说,搜索这样的工具会在几个星期前导致失败。您可能希望在某些地方使用手绘DFD,以确保您不会绊倒某些东西。 Graphviz可以在这方面提供帮助。
它可能有助于将功能复制到Java(我知道这听起来很反常),但您可以在PMD,FindBugs和类似的Java代码质量保证工具的监督下仔细地重构代码。
编辑:我忘记了某个类别的工具可以帮助的部分 - 这些是Java世界中的代码切片工具,我必须承认我没有使用过他们到目前为止。这是一个可能有用的列表:
答案 1 :(得分:2)
我需要想出一种测试方法 我的代码,以确保它出现 与前面的代码相同的答案。
单元测试
由于您提到它是关于在文件中输入参数并输出报告的程序,您可以生成一些输入,为您要对其进行单元测试的部分提供足够的覆盖旧代码的输出。
如果出现问题,请不要忘记您也有可能在旧代码中发现错误。
渐进式端口
我会一点一点地移植它,我觉得它会适合你的问题,因为在报告中你可以抓取特定字段并忽略那些你还没有移植过的字段(假设输出一个字段/计算你不需要移植整个程序)并根据旧代码(或旧代码中的错误的其他正确来源)中的正确值进行验证。
答案 2 :(得分:1)
前一段时间我问了一个有点相关的问题让我想到了一个可行的方法:Is there a Findbugs and / or PMD equivalent for C/C++?
对我来说,如果这段代码如此简陋,或许花一些时间尝试修复/重构它是个好主意。显然,如果你要去Java,那么说服自己花时间改进寿命很短的C ++代码是一件很难的事。也就是说,如果你用改进的代码替换一些明显愚蠢的部分,它可能会更短,更紧,更明显正确,并且当你试图说服自己新代码是功能性时,更容易移植和分析相当于旧代码。
我的问题的答案中建议的最有用的工具是Splint和Cppcheck。
前段时间还有另一个更广泛的问题可能会提出相关的想法:What open source C++ static analysis tools are available?
答案 3 :(得分:0)