提前声明: 一时的突发奇想,我知道也许我想的事早以有人实现,欢迎大佬来斧正我,接收大家的指点。如果真的有小伙伴用了,请将您的想法和发现的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
echo "****Start checking the cpp file to submit****"
rm -rf cppCheckFolder #删除check结果目录
mkdir cppCheckFolder #此脚本生成的文件都会存放到此目录中
git status > ./cppCheckFolder/1.txt #git status 的结果重定向到 1.txt 文件中
checkfilename="-check.txt" #cppCheck 分析文件后缀
checkfilefolder="./cppCheckFolder/"
statusfile="${checkfilefolder}1.txt" # git status 输出文件路径
newfile="*new file" # * 是通配符的意思
modfile="*modified" # * 是通配符的意思
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) #获取是不是新增文件或者修改文件
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)
cppcheck --enable=all --inconclusive ${rowcontent} --output-file=${resfile} #调用 cppCheck 检测
echo "@@@ find a new or mod file ${rowcontent}"
fi
fi
done
echo "****The file to be submitted has been checked****"
echo "****Please check the check result of the corresponding file < XX check. TXT > ****"
使用注意事项
1.如果工程下不同的目录中有相同的文件名的文件,检测结果会被覆盖
2.如果你的工程被某些工具加密了,cppCheck检测会报错
3.记得cppCheck设置环境变量
|