cppCheck 结合 git 的检测脚本(持续更迭)

提前声明: 一时的突发奇想,我知道也许我想的事早以有人实现,欢迎大佬来斧正我,接收大家的指点。如果真的有小伙伴用了,请将您的想法和发现的bug反馈给我,我将不胜感激

        

        使用cppCheck的原因是因为免费,所以就用这个了,最近感觉自己写的代码总会被提出一些错误,所以想用cppCheck工具来辅助我提升代码质量(最好的还是自己时刻谨记代码规范)。

        了解到cppCheck可以检测项目也可以只检测一个cpp文件,其实我还是偏向后者,我一次提交的代码最多就涉及到五六个cpp文件,实在是犯不上检测整个工程,况且还有好多祖传代码,有提示我也不敢动啊,所以我觉得把自己改动的文件改改就行了,争取不给组织制造麻烦。其实公司的gitLib上也有代码规范检测设置,不过比较慢,而且慢慢的都如同虚设了。

        下面就是基于shell写的一个小脚本,在Windows下安装一个git就能用。怎么用呢?你写完代码了,感觉OK了,要提交了(commot),你就打开git bash界面执行一下这个脚本,至于这个脚本放到 .git 目录下就行了。

        我觉得还是有必要说一下我的思路,我就是让cppCheck检测我改过的cpp文件,其他我先不管,其实手动的也可以,但是我懒啊,能自动化就自动化。脚本中先执行一个 git status,就知道新增加的文件和修改的文件,然后用shell筛选一下,得到我想要的cpp文件,接着命令行调用cppCheck,将检测结果文件输出到一个目录下,一个cpp文件对应一个txt。然后就自己看看那里需要改改。就是这么一个简单的思路,似乎最难的就是文本处理了,哈哈哈哈哈。shell也没用过,现学现卖,起码实现了自己想要的功能。

#!/bin/bash
 
input1=$1  #命令行输入第一个参数  【-sd】   Specify directory 指定路径参数
input2=$2  #命令行输入第二个参数  【路径】  路径的最后不需要加/ 否则路径会错误
 
echo "***************开始检测代码***************"
 
checkfilefolder="./cppCheckFolder"  #脚本执行的结果存储路径
 
rm -rf ${checkfilefolder}           #删除上次的check结果目录
mkdir  ${checkfilefolder}           #此脚本生成的文件都会存放到此目录中

checkfilename="-check.txt"          #cppCheck 分析文件后缀
 
statusfile="${checkfilefolder}/1.txt" # git status 输出文件路径

newfile="*new file"           #  * 是通配符的意思  这些是git status中的关键字段
modfile="*modified"           #  * 是通配符的意思
untrackfile="Untracked files" #未跟踪文件
 
#递归查找文件的函数
function read_dir(){
	for file in `ls $1` #注意此处这是两个反引号,表示运行系统命令
	do
		 filepath=$1/$file
		 if [ -d ${filepath} ]    #如果查找到的是目录
		 then
			read_dir ${filepath}
		 elif  [ -f ${filepath} ] #如果查到的是文件
		 then
			echo "发现文件 ${filepath}"
			if [[ ${file} == *.cpp || ${file} == *.h ]] #如果文件后缀是.cpp 或者 .h 
			then
				 resfile=$(echo ${file} | cut  -d "/" -f 2)               #获取 文件 xxx.cpp 或者 xxx.h  
				 resfile=${checkfilefolder}/${resfile}${checkfilename}    #拼接字符串 得出保存结果的文件名(对应着check的cpp)
				 echo "即将被检测的文件 ${filepath}"
				 cppcheck   ${filepath} --enable=all --std=c++11 --output-file=${resfile}  #调用 cppCheck 检测
			else
			   echo "${file} 此文件非.cpp 或者 .h, 不检测"
			fi
		 fi 
	done
} 
 
 
if [[ ${input1} = -sd ]] #输入参数为 -all 则检测所有的 .cpp 和 .h 文件 
then
 
    read_dir ${input2}
	
else
 
    git status ./ -uall >  ${checkfilefolder}/1.txt       #git status 的结果重定向到 1.txt 文件中  
 
	row=$(wc -l ${statusfile} | cut -d " " -f 1)
	for((i=1; i<=row; i++))  #for((i=1; i<=${row}; i++)) 原来使用的for循环在工作机上报错
	do
		rowcontent=$( sed -n ${i}p ${statusfile} | cut  -d ":" -f 1)  #获取是不是新增文件或者修改文件
		echo "${rowcontent}      第${i}行 | 共${row}行"
		if [[ ${rowcontent} == ${newfile} ||  ${rowcontent} == ${modfile} ]]  #这里是模糊比较因为${rowcontent}前面有空格
		#这个if判断 是否是 新增文件或者修改文件,如果是则进入到if中
			then
				filesuffix=$( sed -n ${i}p ${statusfile} | cut  -d "." -f 2)  #获取 新增文件或者修改文件的后缀名
				rowcontent=$( sed -n ${i}p ${statusfile} | cut  -d ":" -f 2)  #获取 新增文件或者修改文件的文件名(带路径)
				if [[ ${filesuffix} == cpp ]]
				#这个if判断的是 新增加或者修改文件是不是.cpp文件,如果是则进入if进行检测
					then
					 resfile=$(echo ${rowcontent} | cut  -d "." -f 1)         #获取 文件名不带后缀名带路径
					 resfile=$(echo ${resfile} | awk -F '/' '{print $NF}')    #去除路径 仅留下文件名
					 resfile=${checkfilefolder}/${resfile}${checkfilename}    #拼接字符串 得出保存结果的文件名(对应着check的cpp)
					 
					 echo "即将被检测的文件  ${rowcontent}"
					 cppcheck   ${rowcontent} --enable=all --std=c++11 --output-file=${resfile}  #调用 cppCheck 检测
				fi
	    elif [[ ${rowcontent} == ${untrackfile} ]] #到这里都是未跟踪的文件所以不需要检测
		   then 
		      break
		fi
	done
 
fi

echo "***********检测代码完毕***************" 

使用注意事项

1.如果工程下不同的目录中有相同的文件名的文件,检测结果会被覆盖

2.如果你的工程被某些工具加密了,cppCheck检测会报错

3.记得cppCheck设置环境变量

4.linux环境下需要将语言设置为英文

2021-12-26 修改

1、对shell脚本进行了更新,通过输入参数可以检测指定目录下的.cpp 或者 .h 文件,方便操作。

2、需要注意的是目前此脚本只能在git bash 中运行,因为没有兼容windows的反斜杠目录,而且需要在init git 的目录下使用,否则会报错

3、说明一下如何使用,进入git bash 后,运行脚本,后面如果没有加参数那么脚本就只会检测已经修改但是没有提交的文件(也就是只检测 git status 输出的文件),如果增加参数(目前只能加 -sd  路径),则脚本会检测指定路径下的文件,是递归查询文件的,当然只检测.cpp 和 .h文件。

4、修改cppcheck 参数

本次修改演示效果

2022-3-10  记录  最近又看了看cppCheck,感觉对参数的解释的资料很少,感觉不能发挥出它最大的功效。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值