C++警告的后果研究
Study of the Consequences of C++ warnings
我刚开始从事一项代码非常旧的工作,即使启用了基本警告,编译这些代码也会产生数千个警告,其中许多对我来说真的很可怕。这些代码大部分是在80年代编写的,所以管理层对有新工程师尝试修复它并不感到兴奋。
我的观点是,消除这些警告应该是当务之急,但我没有任何数据支持我。我理解管理层的想法,即修复所有警告是一项严肃的工作,可能不值得在看起来正常工作的代码上付出努力。我正在寻找一项指向错误/警告或类似的研究,这样我就可以去找他们说:"我们有20万个警告,从研究X来看,很可能有2000个错误隐藏在其中。"
这里的讨论非常相似:https://softwareengineering.stackexchange.com/questions/111616/handling-false-positives-and-legacy-code-warnings-in-static-analysis-of-c-code
我不认为这应该因为偏离主题而结束,因为这是一个:"编程行业特有的实用、可回答的问题。"
由于偏离主题,这篇文章被关闭了,但我发现了一项研究:http://institute.lanl.gov/isti/irhpit/presentations/ensuring-sq.pdfhttp://collaboration.csc.ncsu.edu/laurie/Papers/TSE-0197-0705-2.pdf
我认为没有任何这样的研究。我也要冒险说,管理层是正确的——试图修复所有这些警告,仅仅修复所有这些警报,是个坏主意。
你会通过修正警告来破坏一切!现在,这个代码可能有很多错误,但也有很多正确的地方,对于你来说,在"工作"代码中经历并造成问题是不会顺利进行的。
站在你的立场上,我会着手做我需要做的任何修改/修复。在这个过程中,为你接触的每一件事编写单元测试,并清除你接触的所有事情的警告。
我不知道你的构建系统是什么,但如果可能的话,构建你接触到的所有带有警告的东西,对旧的东西关闭警告,并将你更改的代码移动到新的"干净编译"文件中。
你不会很快掌握它,但你不能只是跳进去改变一堆东西。你必须找到一种工作方式,让你在不破坏最终用户利益的情况下取得进展。
更新:我一开始只是一个评论,但我认为这应该成为答案的一部分。
干净的代码(没有警告的代码、有单元测试的代码、易于理解的代码)不是,也不应该成为任何在现实世界中必须完成任务的开发人员的目标。
清洁代码是我们用来让我们的产品更好,让我们的生活(以及那些追随我们脚步的人的生活)更轻松的工具。这是一个好工具,不,一个伟大的工具,但它只是一个工具。
如果你忽视了实际目标(生产出有效的软件),你可能会陷入与过程相关的琐事中。这可能感觉不错,但通常不会让用户满意,也不会按时发货。
警告并不意味着缺陷。每一个没有经过充分测试的产品都有缺陷。若产品经过良好的测试,那个么就并没有缺陷。
由于其他原因,很多警告都很糟糕。这些警告隐藏了来自维护的新警告(可能表示新产生的缺陷)。因此,维护带有大量警告的代码的成本更高。
修复警告,有时甚至是真正的缺陷,如内存泄漏,都应该小心。绝不能机械地完成。这很可能会破坏正在运行的产品。我已经在实践中见过几十次了。
我同意Michael Khone的大部分说法,但这里涉及到相当多的产品/开发管理,评估取决于此。你应该问自己的一些(但不是全部)主要问题:
- 这个产品的开发模式是什么?它只是不时地进行一些小的增强的错误修复,还是你不断地在上面开发新功能
- 是否有足够的测试覆盖率?如果你没有一个像样的回归套件,像这样进行重大重写就是自杀。即便如此,仍然会有一些错误出现,但总比什么都没有要好得多
- 是否需要更新工具链/平台?这一点很重要,因为许多警告实际上都是不会显示任何问题的,只要你坚持在同一个环境中,你确信这种"有问题"的行为是可预测的(并且可能对你的代码是正确的)。然而,如果你想彻底改变其中一个,那么花时间解决所有这些警告可能是一个非常好的主意
所以警告->错误在很大程度上取决于您的实际产品。
可悲的事实是,修复旧代码往往是徒劳的冒险。旧代码通常没有单元测试,编写代码的人早已离开公司。如果你在代码中看到一些奇怪的事情,可能是出于特定的原因,但从那时起,很多因素都发生了变化,很难进行任何影响分析。重写旧代码时可能会出现太多错误。相反,您应该关注的是以良好的风格编写新的代码。
另一个问题是,管理层完全不理解为什么要重写代码,对他们来说,代码就是功能性的——周期
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- C++ 警告:将新创建的 gsl::owner<> 分配给非所有者
- C++警告的后果研究