为什么要做代码审查?代码审查应该如何进行?代码审查初体验,大家一起来找茬

文章目录

  • 前言
  • 示例1
  • 示例2
  • 示例3
  • 示例4
  • 总结


前言

“代码审查”(Code Review)是一种软件开发过程中,团队成员之间相互检查、评估和改进代码的实践。这一过程通常涉及对代码质量、可维护性、性能、安全性以及是否符合编程规范或项目约定的标准进行评估。代码审查的目的是确保代码的高质量,减少错误,促进团队成员之间的知识共享,并提升整个团队的编程技能。

代码审查的好处包括:
1、提高代码质量:通过多双眼睛的检查,可以发现并修正潜在的错误、遗漏和不良实践。
2、促进知识共享:审查过程是一个学习和交流的机会,团队成员可以了解彼此的工作方式,分享最佳实践。
3、增强团队协作:代码审查鼓励团队成员之间的沟通和合作,有助于建立更紧密的团队关系。
4、提高开发效率:虽然代码审查本身需要投入时间,但长期来看,它可以减少后期调试和修复问题的时间,从而提高整体开发效率。
5、增强代码的可维护性:清晰的代码注释、合理的函数划分和遵循最佳实践的代码更容易被其他开发者理解和维护。代码审查有助于确保新添加的代码符合项目的整体风格和结构,从而保持代码的可维护性。
6、提高安全性:代码审查可以帮助发现潜在的安全问题,如未经验证的输入、不安全的密码存储或敏感信息的泄露。通过审查,可以确保代码遵循了安全最佳实践,并减少了安全漏洞的风险。
7、文化建设和持续改进:代码审查是建立持续改进和持续学习文化的重要手段。它鼓励团队成员不断追求卓越,并努力提升个人和团队的技能水平。通过定期的代码审查,团队可以回顾过去的工作,总结经验教训,并不断优化项目的开发流程和质量标准。

本文以几个C语言的简单示例进行讲解,让大家初步体验一下代码审查的乐趣。


示例1

被审代码:

//求绝对值
#define  abs(x)  x >= 0 ? x : -x

问题分析:
这是一个常见的宏定义规范性问题:宏参数没有使用括号括起来,宏展开后可能发生错误。比如执行“c = abs(a-b);”语句时,宏替换后变成“c = a-b >= 0 ? a-b : -a-b;”,当a-b小于0时,结果错误。
修复建议:

//求绝对值
#define  abs(x)  (((x) >= 0) ? (x) : -(x))

示例2

被审代码:

//求平方
int square(volatile short *ptr)
{if( ptr == NULL ){return -1;}return (*ptr) * (*ptr);
}

问题分析:
这是嵌入式软件中比较容易忽视的一个问题。ptr指向一个被volatile修饰的地址,ptr的值可能被意想不到地改变,因此前一个ptr和后一个*ptr可能是不同的值,计算出来就可能不是平方值。
修复建议:

//求平方
long square(volatile short *ptr)
{long tmp;if( ptr == NULL ){return -1;}tmp = *ptr;return tmp * tmp;
}

示例3

被审代码:

#define FAULT_MAX 10
unsigned char i = 0;
void fault_func(void)
{if(fault_status == TRUE){i++; //故障计数加1}else{i = 0; //故障计数清零}If(i >= FAULT_MAX){record_fault(); //记录故障}else{recover_fault(); //恢复故障}
}

问题分析:
这是一个常见的基本数据类型数值溢出问题。故障计数器i超过255后将发生溢出翻转,重新变为0然后递增,此时仍有故障,却会被处理成故障恢复。
修复建议:

#define FAULT_MAX 10
unsigned char i = 0;
void fault_func(void)
{if(fault_status == TRUE){i++; //故障计数加1} else{i = 0; //故障计数清零}If(i >= FAULT_MAX){record_fault(); //记录故障i = FAULT_MAX; //限制计数器不再增加(或其他改法)}else{recover_fault(); //恢复故障}
}

示例4

被审代码:

//中断服务子程序
#define  PI  3.14159F
__interrupt  double  compute_area (double radius)
{double area = PI * radius * radius;printf("Area = %f \n", area);return area;
}

问题分析:
这段程序的错误太多了,至少包括:
1、ISR (中断服务程序)不能有返回值;
2、ISR 不能传递参数;
3、ISR应该是短而有效率的,在ISR中做浮点运算是不明智的(对浮点运算而言,有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器直接不允许在ISR中做浮点运算);
4、printf()有重入和性能上的问题,一般不建议在ISR中使用。


总结

以上仅作为简单示例,基本上是根据个人经验进行的代码审查,只是让大家有个简单认识。
在真正的工作中,为了进行有效的代码审查,团队成员应该遵循一些基本原则,如保持开放和尊重的态度,专注于代码本身而非编写代码的人,以及提供具体、可操作的反馈等。此外,项目或团队还可以制定自己的代码审查规范和流程,以及制定详细的代码审查单,以确保这一过程能够顺利进行并达到预期的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模电基础 - 放大电路的频率响应

目录 一. 简介 二. 频率响应的基本概念 三. 波特图 四. 晶体管的高频等效模型 五. 场效应管的高频等效模型 六. 单管放大电路的频率响应 七.多级放大电路的频率响应 八. 频率响应与阶跃响应 一. 简介 放大电路的频率响应是指在输入不同频率的正弦信号时,电路…

Linux基础-管道命令

管道命令 一、概述二、常见用法1. 统计某个目录下的的文件个数2. 对目录下的排序并抓取关键词保存到文件中3. 获取一个目录下的所有子目录名称 一、概述 管道命令是非常有用的工具。在日常工作中用的非常多,他其实是一个并连命令的高级版。用一句话来概括 "把…

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x1f60…

SSM高校学生综合测评系统-计算机毕业设计源码16154

摘要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个BS 结构的高校学生综合测评系统,会使高校学生综合测评系统工作系统化、规范化,也会提高高校学生综合测评系统平台形象,提高管理效率。 本学生综合测评系统是针对目前高校学生…

君方智能设计平台-对象持久化技术方案

1.背景介绍 1.1序列化功能 序列化是将复杂的图形对象、数据结构或对象转换成一种可被存储、传输或分享的格式的过程。这个格式通常是二进制或文本形式,能够轻松地保存在文件中或通过网络发送到其他应用程序。序列化的目的是将数据持久化,使其在不同时间…

Java中的消息中间件与异步通信实现

Java中的消息中间件与异步通信实现 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 消息中间件和异步通信在现代软件系统中扮演着重要角色。它们可以帮助解耦系…

【代码随想录算法训练营第六十二天|卡码网108.冗余连接、109.冗余连接II】

文章目录 108.冗余连接109.冗余连接II 108.冗余连接 就是对输入进来的边判断是否在一个并查集中,在的话就把这个删除了,不再就加入并查集中。 n int(input()) father [0] * (n1) def init():for i in range(n1):father[i] idef find(u):if father[u…

服务器本地部署文件服务器minio

minio类似于阿里云的OSS,为不方便把图、文、日志等形式的文件保存在公有云上的,可以在自己的服务器上部署文件服务器 看过本人前几个文章的,使用docker就会很快上手部署,直接上所有代码 #添加镜像 docker search minio docker p…

干货丨做新媒体运营,你必须了解的5大平台规则

5大平台必看规则 01.小红书 平台特性 小红书是一个以生活方式分享为主的“社区+电商”平台。 其中80%都是女性用户拥有精准的女性流量,是美妆护肤、潮流包包的种草地!小红书整体的内容围绕的是精致、极简、自律、丰富有趣的生活。 用户画像…

怎么给电子文档批量盖骑缝章或公章?

怎么给电子文档批量盖骑缝章或公章?假如你有100个PDF电子文档要同时盖缝章,如果不借助专业的盖电子骑缝章软件,还真不好干。下面讲述如何利用e-章宝批量盖电子骑缝章。 1.在软件中导入待批量盖章的PDF文件 如下图,在“待盖章PDF文件”区域…

aws slb

NLB 目标组 Target is in an Availability Zone that is not enabled for the load balancer 解决: https://docs.aws.amazon.com/zh_cn/elasticloadbalancing/latest/network/load-balancer-troubleshooting.html 负载均衡器添加 后端EC2 所在的vpc网段即可。…

谨慎投稿!这本EI期刊正在被“劫持”!

Journsl ofTisniin lniversity Seience and Technology《天津大学学报(自然科学与工程技术版)》创刊于l955年,月刊,全国核心期刊,天津市一级期刊。该刊是由天津大学主办的综合性学术刊物,主要刊登自然科学和…

这款拖拽式大屏设计神器,太惊艳了!收藏吧!

概念​ 可视化大屏是当今信息时代的一种重要技术工具,它以大屏幕为显示终端,通过图形、图表、地图等形式将大量数据和信息直观地呈现出来,帮助用户更好地理解和分析数据。 JVS智能BI的可视化大屏从界面布局、色彩搭配,到图表类型…

一个生成4种UUID的Typescript代码(不依赖任何库)

最近写个uni-app前端,由于要兼容小程序环境,标准几个npm里的库都不能用了。看了下网上的uuid js库,再加上short-uuid的源码。一并输入GPT敲打了几个来回后,得到这样的代码: uuid.ts enum UUIDFormat {CookieBase90,F…

大模型推理加速调研(框架、方法)

大模型推理加速的目标是高吞吐量、低延迟。吞吐量为一个系统可以并行处理的任务量。延时,指一个系统串行处理一个任务时所花费的时间。调研了一些大模型推理的框架。 框架llama.cpprtp-llmvllmTensorRT-LLMLMDeployfastllm语言Chttps://github.com/ggerganov/llama…

SpringBoot项目——送水管理系统

1、导入坐标 坐标作用pagehelper-spring-boot-startermybatis分页插件spring-boot-starter-thymeleafJSP模板引擎mybatis-spring-boot-startermybatisspring-boot-starter-webwebspring-boot-starter-testtestlombok不需要再写getter、setter或equals方法,只要有一…

通过,注解@value,读取配置文件中的数据(并设置默认值)

1.定义配置类 import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component;/*** lecheng云相关配置*/ Component Data Re…

3D问界—什么是blender,与MAYA有什么区别

问题提出:什么是blender,与MAYA有什么区别 Blender 是一个开源的、免费的 3D 建模和动画软件,广泛应用于各种领域。它提供了丰富的功能和工具,适用于从业余爱好者到专业艺术家的不同需求。 1. Blender 的主要用途和功能 属 性描述…

Vue2基础 13:内置指令

内置指令 1 指令梳理2 补充指令2.1 v-text2.2 v-html2.3 v-cloak案例--延迟引入vue造成js阻塞 2.4 v-once案例--点击按钮1并展示初始的值 2.5 v-pre 1 指令梳理 前面几节的基础学习已经用到了部分的指令,先梳理一下。 指令描述v-bind单向绑定解析表达式&#xff0…

零件机加工行业数字化转型,HSMES助您一臂之力!

由于刀具磨损、切削参数不合适以及机床老化等问题,导致加工效率低下;随着产品精度的不断提高,对加工技术的要求也越来越高。然而,许多企业缺乏先进的加工技术和经验,导致产品质量不稳定,难以满足客户需求&a…