Tag: 遗留

在一个大的C ++遗留应用程序中查找“死代码”

我目前正在开发一个在我之前有许多开发者的大而古老的C ++应用程序。 项目中有很多“死代码”,类和function已经不再被任何人使用。 C ++有哪些工具可用于分析大代码库来检测和重构死代码? 注意:我不是在谈论像gcov这样的testing覆盖工具。 你如何在你的项目中find死代码?

你如何将unit testing引入一个大的,传统的(C / C ++)代码库?

我们有一个用C语言编写的大型多平台应用程序(只有less量的C ++)。多年来,随着C / C ++大型应用程序中许多function的不断发展, #ifdef地狱 大的文件,很难隔离可testing的代码 function太复杂,不易testing 由于这个代码是针对embedded式设备的,所以在实际的目标上运行它会花费很多的开销。 因此,我们希望在本地系统上进行更多快速周期的开发和testing。 但是我们希望避免“复制/粘贴到您的系统上的.c文件,修复错误,复制/粘贴”的经典策略。 如果开发人员要麻烦去做,我们希望能够在以后重新创build相同的testing,并以自动化的方式运行。 这是我们的问题:为了重构代码,使其更加模块化,我们需要它更加可testing。 但是为了引入自动化的unit testing,我们需要它更加模块化。 一个问题是,由于我们的文件太大了,我们可能会在一个文件里面有一个函数,在同一个文件中调用一个函数,我们需要把这个文件作为一个unit testing。 看起来这样做会less一些问题,因为我们的代码变得更加模块化了,但是还有很长的一段路要走。 我们想要做的一件事就是用注释标记“已知是可testing的”源代码。 然后,我们可以为可testing代码编写一个脚本扫描源文件,将其编译为单独的文件,并将其与unit testing链接。 我们可以在修复缺陷并添加更多function时,慢慢地引入unit testing。 但是,有人担心维护这个scheme(以及所有必需的存根函数)会变得太麻烦,开发人员将停止维护unit testing。 所以另一种方法是使用一个工具自动生成所有代码的存根,并将其与该文件链接。 (我们发现这样做的唯一工具是一个昂贵的商业产品)但是这种方法似乎要求我们所有的代码在开始前都要更模块化,因为只有外部调用才能被删除。 就个人而言,我宁愿让开发人员考虑他们的外部依赖关系,聪明地写出他们自己的存根。 但是,这可能是压倒性的,以排除一个可怕的杂草丛生的10,000行文件的所有依赖关系。 要说服开发人员需要为所有的外部依赖维护存根可能是困难的,但这是否正确? (另一个我听说的论点是,一个子系统的维护者应该为他们的子系统维护存根,但是我想知道是否迫使开发者写他们自己的存根会导致更好的unit testing?) #ifdefs当然会为这个问题增加另外一个维度。 我们已经看过几个基于C / C ++的unit testing框架,并且有很多选项看起来不错。 但是我们还没有find任何东西来缓解从“没有unit testing代码的毛球”到“unit testing代码”的过渡。 所以这里是我的问题给任何其他谁已经通过这个问题: 什么是一个好的起点? 我们正朝着正确的方向走,还是我们错过了一些明显的东西? 什么工具可能有助于转型? (最好是免费/开源,因为我们现在的预算大致为零) 请注意,我们的构build环境是基于Linux / UNIX的,所以我们不能使用任何仅限于Windows的工具。

bash:$ 与$((<arithmetic-expression>))

我刚刚碰到了bash语法: foo=42 bar=$[foo+1] # evaluates an arithmetic expression 当我谷歌search这个,我发现http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_05 : 3.4.6。 算术扩展 算术扩展允许评估算术expression式和replace结果。 算术扩展的格式是: $(( EXPRESSION )) … 只要有可能,Bash用户应该尝试使用带有方括号的语法: $[ EXPRESSION ] 但是,这只会计算EXPRESSION的结果,不做任何testing… 在我的bash手册页中,我只能find$(( EXPRESSION ))forms,如: foo=42 bar=$((foo+1)) # evaluates an arithmetic expression 那么什么样的testing不是用$[…] $((…))执行的$[…]执行的,还是$[…]只是$((…))的传统版本?