翻译《有关编程、重构及其他的终极问题?》——40.开始使用静态代码分析

本文探讨了静态代码分析在软件开发中的重要性,通过实例展示了常见编程错误的识别,如重复比较自身变量。文章强调了代码复查、单元测试与静态代码分析结合使用的必要性,推荐了PVS-Studio等工具,并提醒合理利用分析结果。

翻译《有关编程、重构及其他的终极问题?》——40.开始使用静态代码分析

标签(空格分隔):翻译 技术 C/C++
作者:Andrey Karpov
翻译者:顾笑群 - Rafael Gu
最后更新:2018年09月28日


40.开始使用静态代码分析

阅读一位静态代码分析器的开发者写的一大段文字,却不知道如何使用静态代码分析,这是非常奇怪的。所以这次我们就来说说如何使用静态代码分析。

下面的代码摘自Haiku项目(从BeOS项目继承而来)。这段代码包含的错误被PVS-Studio分析器诊断为:There are identical sub-expressions to the left and to the right of the ‘<’ operator: lJack->m_jackType < lJack->m_jackType(译者注:大意为“<”操作符两边的变量是一样的)。

int compareTypeAndID(....)
{
  ....
  if (lJack && rJack)
  {
    if (lJack->m_jackType < lJack->m_jackType)
    {
      return -1;
    }
    ....
}

解释

这只是一个平常的打字错误,在表达式的右边,理应是rJack,却被写成了lJack。

这种打字错误的确比较简单,但实际产生这种情况的原因却很复杂,这可能牵扯到编程风格等一系列问题,但即使知道什么问题导致,也无助于解决。大家就是这么眼睁睁的犯下类似错误,你却无能为力。

很重要的是,我们要意识到,这种问题不是特定的人或者特定的项目才有。毫无疑问,所有人都会犯类似错误,即使在正规项目总的专家们也会犯。我说这些是有证据的,你可以看到类似最简单的A == A这种打字错误,都可以在如下项目中被发现:Notepad++,WinMerge,Chromium,Qt,Clang,OpenCV,TortoiseSVN,LibreOffice,CoreCLR,Unreal Engine 4等。

因此这类问题是真实存在的,不光是在实验室中的学生项目中。当一些人告诉我说那些有经验的程序员不会犯下这类错误时,我就给他们发送了这个链接

正确的代码

if (lJack->m_jackType < rJack->m_jackType)

建议

首先,让我们说一些无用的敲门:

  • 编程时要很小心,不要让错误偷溜进你的代码(说的好听,但毫无用处)
  • 使用好的代码风格(事实上,不存在一种编程风格可以避免变量名的拼写错误)

那么,那些是真正有用的呢:

  • 代码复查(译者注:就是我们一般直接使用英文说的code review)
  • 单元测试(TDD)(译者注:TDD就是敏捷开发中的测试驱动)
  • 静态代码分析

我不得不说,以上每种策略都有它的长处和短处,这就是为何最好、最有效的办法就是把他们一起使用。

代码复查能帮助我们找出大量的不同错误,并且,能帮助我们提高代码的可阅读性。但不幸的是,这种策略的代价时非常昂贵的,而且比较无聊,最后也不能给出一个完全有效复查的保证。比如,下面的代码打字错误就非常难以被发现:

qreal l = (orig->x1 - orig->x2)*(orig->x1 - orig->x2) +
          (orig->y1 - orig->y2)*(orig->y1 - orig->y1) *
          (orig->x3 - orig->x4)*(orig->x3 - orig->x4) +
          (orig->y3 - orig->y4)*(orig->y3 - orig->y4);

理论上,单元测试可以拯救我们。但只在理论上有这个可能。因为实际上,检查所有的执行路径是不现实的;除此之外,一个测试本身也有可能包含错误:)

静态代码分析器也会有问题,而且也不是智能化的。一个分析器可能忽略一些错误,另一方面,还有可能显示一些实际上正确的错误。但除了这些问题外,静态代码分析器其实能算得上是一种真正有用的工具,它可以在初期就可以发现大量的错误。

一个静态代码分析器可以被用来做性价比高的代码复查。使用程序而非程序员来做代码复查,然后更全面的建议检查特定的代码片段。

当然,我很愿意建议大家使用我们开发的PVS-Studio代码分析器,但这并非世界上唯一一款代码分析器,还有其他很多免费或付费的同类工具。比如你可以尝试使用一下免费、开源的分析器Cppcheck。你可以在Wikipedia上找到大量的同类工具:静态代码分析工具列表

注意:

  • 错误的使用一个静态代码分析器可能反而会让你头疼。比如一种典型的错误就是“尽量多的得到检查结果的警告消息”。这是我经常收到的建议,所以就得到了一个很多很多的错误警告列表,对于这种情况,这两篇文章AB会有帮助。
  • 一个静态代码分析器应该被当成基本工具使用,而不仅仅是每次使用一下,或者当项目情况越来越糟糕了才使用。相关的的解释可以看CD这两篇文章。

真的,尝试用用静态代码分析工具吧,你会喜欢上他们的,他们是非常好的清洁工具。

最后,我很愿意推荐大家读一下John Carmack的文章:静态代码分析

同步定位与地图构建(SLAM)技术为移动机器人或自主载具在未知空间中的导航提供了核心支撑。借助该技术,机器人能够在探索过程中实时构建环境地图并确定自身位置。典型的SLAM流程涵盖传感器数据采集、数据处理、状态估计及地图生成等环节,其核心挑战在于有效处理定位与环境建模中的各类不确定性。 Matlab作为工程计算与数据可视化领域广泛应用的数学软件,具备丰富的内置函数与专用工具箱,尤其适用于算法开发与仿真验证。在SLAM研究方面,Matlab可用于模拟传感器输出、实现定位建图算法,并进行系统性能评估。其仿真环境能显著降低实验成本,加速算法开发与验证周期。 本次“SLAM-基于Matlab的同步定位与建图仿真实践项目”通过Matlab平台完整再现了SLAM的关键流程,包括数据采集、滤波估计、特征提取、数据关联与地图更新等核心模块。该项目不仅呈现了SLAM技术的实际应用场景,更为机器人导航与自主移动领域的研究人员提供了系统的实践参考。 项目涉及的核心技术要点主要包括:传感器模型(如激光雷达与视觉传感器)的建立与应用、特征匹配与数据关联方法、滤波器设计(如扩展卡尔曼滤波与粒子滤波)、图优化框架(如GTSAM与Ceres Solver)以及路径规划与避障策略。通过项目实践,参与者可深入掌握SLAM算法的实现原理,并提升相关算法的设计与调试能力。 该项目同时注重理论向工程实践的转化,为机器人技术领域的学习者提供了宝贵的实操经验。Matlab仿真环境将复杂的技术问题可视化与可操作化,显著降低了学习门槛,提升了学习效率与质量。 实践过程中,学习者将直面SLAM技术在实际应用中遇到的典型问题,包括传感器误差补偿、动态环境下的建图定位挑战以及计算资源优化等。这些问题的解决对推动SLAM技术的产业化应用具有重要价值。 SLAM技术在工业自动化、服务机器人、自动驾驶及无人机等领域的应用前景广阔。掌握该项技术不仅有助于提升个人专业能力,也为相关行业的技术发展提供了重要支撑。随着技术进步与应用场景的持续拓展,SLAM技术的重要性将日益凸显。 本实践项目作为综合性学习资源,为机器人技术领域的专业人员提供了深入研习SLAM技术的实践平台。通过Matlab这一高效工具,参与者能够直观理解SLAM的实现过程,掌握关键算法,并将理论知识系统应用于实际工程问题的解决之中。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值