共计 3814 个字符,预计需要花费 10 分钟才能阅读完成。
本文作者:潘金赤 —— CODING 产品总监
腾讯云研发平台负责人,十年研发能效建设教训
CODING 代码扫描产品负责人
有位小伙子在办公大楼门口抽烟,一位路人通过他的身边对他说:“你知不知道这个货色会危害你的衰弱?你有没有留神到香烟盒上的那个正告(Warning)?”小伙子说:“没事儿,我是一个程序员。”路人说:“这又怎么?”程序员答复道:“咱们从来不关怀 Warning,只关怀 Error。”
以笑收场,这是一篇写给极少应用 / 理解代码扫描工具的用户的“启蒙”读物。一方面因为代码扫描存在肯定的技术壁垒,波及到词法 / 语法分析、编译注入、模式识别及平安等相干畛域,想要理解这方面的内容可能难以下手;另一方面,因为目前公众对于代码扫描产品及其畛域还存在着较多误会,极大水平上影响了代码扫描的应用体验,更有甚者间接把 Lint/Style 与扫描划了等号,让人哭笑不得。
CODING 代码扫描自凋谢试用以来,已累计为 5000+ 团队提供扫描服务,帮忙开发团队及时发现了大量潜藏的代码缺点、安全漏洞以及不标准代码。心愿通过这篇文章,以一些常见场景为例,通俗易懂地解释代码扫描的价值与应用办法,帮忙读者深刻了解,疾速上手,让代码扫描产品在助力企业建设 DevSecOps 的路线上,施展最大的价值。
代码扫描有什么价值
抛开那些陈词滥调的 品质前移 或 品质内建 的概念,从理论使用的角度来看, 代码扫描往往是一个团队向 DevOps 转型的第二步(第一步是继续集成 / 流水线)。一是因为流水线上只跑了编译打包部署还是略显薄弱,二是相比单侧、接口自动化及 e2e 自动化,接入代码扫描的老本是最低的。以 Jenkins 为例,只须要运维在 Jenkins 集群中装置 SonarQube 插件,再在 Jenkinsfile 中减少一行命令,就能够在无需开发人员染指的前提下,实现代码扫描的接入。
此外,稍有代码文化意识的开发也会在本地 IDE 中装置插件做本地查看,一旦呈现语法或者格调问题时能间接在 IDE 上标注警示甚至主动修复。
越容易失去的货色往往也最容易被忽视,IDE 的 auto inspect/format 或流水线的静默执行,容易让研发淡化代码扫描的感知和价值:我有做 Style check,实现了代码查看工作 、 研发上线周期太紧张,扫描的问题当前再看 、 代码扫描发现的问题无伤大雅 、 代码扫描这个工具 / 环节可有可无 。 事实上,各大软件 / 互联网厂商每年都会破费上百万购买各类扫描软件 License(SonarQube、Coverity、Checkmarx 等),而这些公司也均为估值十多亿的行业佼佼者(16 年 Sonar 获 4500 万美金融资,14 年 Coverity 以 3.75 亿被收买)。微小的市场价值和低微的存在感,为什么会呈现这样的景象?要弄清楚这个问题,首先看看代码扫描能帮忙咱们发现哪些问题。
0. 编程语法问题
之所以列为第 0 项,是因为我认为这个问题甚至不属于代码扫描的领域。目前有十分多的 IDE 和插件集成了语法查看相干的性能,帮忙开发在研发过程中查看、提醒甚至是主动修复语法问题,解决了一些代码品质上的问题,但这是语法解析器的职责,与代码扫描关系甚微。
1. 代码标准问题
很多读者看到这可能会露出“我又懂了”的表情,这是目前代码扫描给大家留下的最广泛的感知:查看有没有正文 、 缩进是空格还是 Tab、大括号是另起一行还是接着上一行 等等。诸如此类的查看规范很容易在团队中引发论战,同时因为这类问题也并不妨碍性能逻辑的正确运行(不关怀 Warning,只关怀 Error),所以很多人对代码扫描的尝试就到这里了。
然而,代码标准真的举足轻重吗?
如果此处没有特地揭示,你能意识到动静语言中返回值不统一,前面可能存在什么困扰么?
如果此处没有特地揭示,你能意识到入参这里为可变对象,可能会引入什么问题么?
如果持续放任 for、if、try 的嵌套,之后这部分代码该如何读?
后续变更模型字段后,还能记得须要批改多处雷同代码吗?
代码标准类的扫描就是为了解决“在代码里下毒”的最无效伎俩。同时针对多人合作项目,如果要防止“当我写这个代码时,只有我和上帝晓得是什么意思;一个月后,只有上帝晓得”的场景,遵循对立的代码标准也是十分必要的。
2. 性能缺点
很多人抱有侥幸心理:“我的代码可能就这一个版本,当前不须要再保护,所以能跑就 OK 了”。那么让代码扫描来帮忙确认一下,你的代码真的能跑吗?
这些空指针问题,你确定都能测试进去?
数组越界的问题,通过人肉 CR 发现的难度有多大?
更别提这种内存透露问题,没有工具帮忙人肉定位,治理内存还是须要一些功夫。
从这个角度来看,代码扫描等同于测试环节,是保障利用性能失常的无效伎俩,也能更高效地发掘出更有深度的技术问题。
3. 平安缺点
可能有的读者还会感觉“我的性能很简略,点几下就测试通过了,没什么别的问题”。要晓得一个应用程序除了要从性能上满足用户,还须要盯防虎视眈眈的黑产,万豪泄露用户数据蒙受重罚 相似的案件历历在目,咱们有多大的把握能保障不是下一个指标?
起源:InfoQ 万佳
拖库很重要的一个切入点就是 SQL 注入,而这类问题用代码扫描工具能够很容易发现。
近程命令执行也是攻克指标机器的罕用伎俩,许多罕用的开源组件都被爆出过相似问题,你确定你的安全意识比 Apache 还要好吗?
还有 CSRF、XSS、XXE、反序列化等多重攻打伎俩,如果每个一线程序员都须要对这些一目了然小心避让,那管控老本将直线回升。通过代码扫描疾速查找与定位危险,能够以最低老本为数字资产保驾护航。动态代码剖析(SAST)也是 DevSevOps 里最根底、最低门槛的检测形式之一。
4. 公关危险
“别逗了,聊代码品质怎么还能聊出公关问题”,先别笑,让咱们看一则新闻:vivo 的升降摄像头:流氓软件检测器还是智商鉴定器?
起源:品玩
简略来说,Android 应用程序在获取摄像头参数时,调用的函数可能会触发摄像头的升起,但实际上看客并不会深究这里的技术实现细节。关上了摄像头,就是想偷拍用户,这在过后是一场不折不扣的公关危机,还掀起了不小的风波,波及到了各方。在对外科普造谣的同时,腾讯外部也组织出了一套敏感 API 扫描计划,通过代码扫描工具来扫描我的项目中的敏感接口,揭示开发人员自查确认,避免造成更大的危险。
代码扫描应该怎么用
通过上文,大家可能逐渐意识到了代码扫描为团队带来的价值:以低门槛无侵入的形式保障代码品质和平安,那么就去下载了 SonarQube、Spotbugs、Checkstyle 等工具,简略配置后便在本地或 Jenkins 流水线上跑起来了。但既然代码扫描更偏差于本地离线的工具,CODING 为什么要在线上平台提供代码扫描呢?
本地扫描,规定与远端同步
即使是本地扫描,咱们也不心愿本地规定和远端的规定有差别,导致本地扫描通过提交后又被驳回。解决这个问题最正当的形式是 IaC,即扫描计划和过滤条件等都以本地配置文件的形式去保留。
但并不是所有工具的规定配置都能够本地化治理,例如过滤条件、比照分支等和利用场景强相干的配置项。针对这类诉求,应答的思路有两种:
- 用户在平台侧实现对立的配置(包含工具规定、过滤条件、比照分支等),配置实现后生成配置 ID。本地扫描时不再基于本地配置文件,而是基于远端的配置 ID。
codedog_client localscan --config 001
- 平台配置的本地化,即扫描平台定义残缺的规定格局。不仅本地扫描时遵循此配置,在平台展现时也能解析文件配置生成可视化展现,从而达到对立的 IaC 配置。
细化到人,把问题转为责任
本地扫描能够发现问题,然而难以发现此问题的引入人和引入机会,因而这些问题要不要改、谁来改,存在着纠缠和推诿的可能。而 平台能够基于代码的提交记录,追溯到代码的变更机会,发现问题责任人,从而以责任人为视图进行问题跟踪,甚至能够转成 Bug 专项跟进。谁净化谁治理,这很正当。
此外,平台还能够依据下一次扫描的后果,主动敞开以后曾经修复的代码问题,节俭人工操作。
代码库品质追踪
把问题放在平台归档还有一个益处,就是能够很 清晰的晓得某个仓库的代码品质趋势,例如在某个工夫点引入了新问题导致整体品质变差,或是在某个工夫点解除历史负载品质晋升。可视化的品质稳定趋势图也能够帮忙团队管理者更直观的判断,以后是否须要为团队的代码品质敲敲警钟。
品质门禁,既往不咎来者可追
只是做本地扫描,还是会有“心大”的开发者不修复问题间接 push 到远端,这时就能够通过平台侧提供的品质门禁性能来做拦挡了。品质门禁能够定义以后仓库能够容许的问题数量,当超出问题数量,这次提交或者合并申请将被拦挡。
通常,历史我的项目在接入扫描时会一次性扫出成千盈百个遗留问题,而团队也不太可能专门预留工夫一次性根治,导致“刚入门就劝退”。针对这类场景咱们的倡议是,设置 MR 的品质门禁为新增问题数,保障在代码合入时不会有新代码品质问题引入,管制增量的同时再逐渐清理存量问题(业务需要会改到哪个文件,就修复这个文件的代码品质问题),通过这种形式缓缓将代码品质拉回正规。
总结
某种程度上咱们认可越大规模的团队越须要代码扫描工具,来帮忙团队晋升面对标准和简单问题的规范和效率。针对 SMB 和集体开发者,代码扫描也仍然是接入老本最低的品质晋升工具。心愿通过以上案例和场景,能帮忙各位读者疾速定位我的项目中的卡点并顺利解决,关注每行代码迭代,传承卓越代码文化。
点击体验代码扫描工具实现团队效率晋升