PC_Lint扫描工具操作过程

PC_Lint扫描工具操作过程


本节前言
PC-Lint 专门针对C/C++  开发的代码静态分析工具,它能有效地发现程序语法错误、潜在的错误隐患、不合理的编程习惯等。
C语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C编译器不进行强制类型检查,也带来了代码编写的隐患。PC-Lint能识别并报告C语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等等。软件除错是软件项目开发成本和延误的主要因素。PC-lint能够帮你在程序动态测试之前发现编码错误,这样消除错误的成本更低。

本节正文

1. 简介

PC-Lint的使用过程,如何进行代码扫描等过程,本文进行介绍.方便你的使用

2. 过程

(1)获取差异文件,(如果已经知道要扫描哪些文件了,就不需要执行此步骤,否则先执行此)
     *如果代码量很小的话,可以采用对比工具对比即可,例如:Beyond Compare 
     *如果代码量很大,我的是比较android 源码,这样很大量代码,需要比较两个不同时间版本.
     同一目录下取下不同版本的项目代码,这里我用了一个脚本文件,用于比较,找出差异的c/c++文件,名称随意:cmp_c.sh
# /bin/bash

#---------------check parameter---------------
# arg1: $CURRENT_CODE_DIR   
# arg2: $OLD_CODE_DIR       
#---------------------------------------------

#CURRENT_CODE_DIR=$1
#OLD_CODE_DIR=$2
#echo "***********************************************************"
#echo "CURRENT_CODE_DIR=${CURRENT_CODE_DIR}"
#echo "OLD_CODE_DIR=${OLD_CODE_DIR}"
#echo "***********************************************************"

current_path=${PWD}

code_dir=${current_path}/AW807_new
oldcode_dir=${current_path}/AW807_old
temp_file=${current_path}/C_CPP.tmp
result_file=${current_path}/result_a.txt

pushd ${code_dir}
    find -type f -name *.c -o -name *.cpp | tee ${temp_file}
popd
    echo "find completed!" 

    for i in $(cat ${temp_file}); do
        file=${i#*/} 
        file1=${code_dir}/$file
        file2=${oldcode_dir}/$file
        diff $file1 $file2 > /dev/null 2>&1 && result=0 || result=1
        if [ "$result" == 1 ]; then
           echo ${file1} >> ${result_file}
        else
           echo "${file1}        same"
        fi
    done
    echo "The end"
  此时可以看到会生成一个result_a.txt 的文件. 里面列举了所有的匹配的差异c/c++ 文件..

 (2) 知道了差异的文件,即为目标扫描文件,然后就要扫描对应文件存在的文件路径.
     将pc_lint工具包跟build_pclint.sh脚本文件放到一个目录下,
     需要注意这里的pc_lint工具包从网上下载直接可以使用的,仅仅配置好options.lnt即可, 同时build_pclint.sh这个脚本文件
     用于启动pc_lint工具和lnt文件来进行代码扫描
     此build_pclint.sh 文件如下:
# /bin/bash

#---------------check parameter---------------
# arg1: $LINT_TOOLS_PATH      pclint工具绝对路径
# arg2: $LINT_FILE_DIR        lnt文件绝对路径
# arg3: $CHECK_FILE           要检查的c或cpp文件的绝对路径
# arg4: $CODE_ROOT_DIR        代码根路径(绝对路径)
#---------------------------------------------

LINT_TOOLS_PATH=$1
LINT_FILE_DIR=$2
CHECK_FILE=$3
CODE_ROOT_DIR=$4
echo "***********************************************************"
echo "LINT_TOOLS_PATH=${LINT_TOOLS_PATH}"
echo "LINT_FILE_DIR=${LINT_FILE_DIR}"
echo "CHECK_FILE=${CHECK_FILE}"
echo "CODE_ROOT_DIR=${CODE_ROOT_DIR}"
echo "***********************************************************"
export LINT_TOOLS_PATH=${LINT_TOOLS_PATH}
export LINT_DIR_WIN=Z:${LINT_TOOLS_PATH//\//\\}
if [[ ! -f ${LINT_FILE_DIR} ]];then
    echo "lnt file is not exist"
    exit 1
fi
dos2unix ${LINT_FILE_DIR}
mac2unix ${LINT_FILE_DIR}
lnt_content=$(cat ${LINT_FILE_DIR})
#lnt_content=$(uniq ${LINT_FILE_DIR})
result_path=${CHECK_FILE##*/}
current_path=${PWD}
mkdir -p ${current_path}/xml/${result_path}
#report_name=${current_path}/${report_name%.*}.xml
#echo "report_name=${report_name}"
if [[ ! -d  ${CODE_ROOT_DIR} ]];then
	echo "code dir is not exist, please check it"
	exit 1
fi
pushd ${CODE_ROOT_DIR}

#	find /cloud/jslave/workspace/Y5II-L_ANDROID/android_code -type f -name *.c -o -name *.cpp > /cloud/jslave/pclint_test/tmp
       
        find ${CHECK_FILE} -type f -name *.c -o -name *.cpp > /mnt/workspace/tmp
	for i in $(cat /mnt/workspace/tmp); do
#		echo $i
		report_name=${i##*/}
		report_name=${current_path}/xml/${result_path}/${report_name%.*}.xml
#                echo "report_name=${report_name}"
#               echo "${LINT_TOOLS_PATH}/LINT-NT.EXE -i$LINT_DIR_WIN env-xml.lnt options.lnt ${lnt_content} $i >${report_name}"
		${LINT_TOOLS_PATH}/LINT-NT.EXE -i$LINT_DIR_WIN env-xml.lnt options.lnt ${lnt_content} $i > ${report_name}
	done
    echo "${LINT_TOOLS_PATH}/LINT-NT.EXE -i$LINT_DIR_WIN env-xml.lnt options.lnt ${lnt_content} ${CHECK_FILE} >${report_name}"
#    ${LINT_TOOLS_PATH}/LINT-NT.EXE -i$LINT_DIR_WIN env-xml.lnt options.lnt ${lnt_content} ${CHECK_FILE} > ${report_name}
popd

可以看到启动此脚本时候,需要携带有参数内容,指定文件路径和项目路径即可. 会生成一个xml 文件包,
./build_pclint.sh   /mnt/workspace/pc-lint-auto    /mnt/workspace/include_6735.lnt               /mnt//system/security/keystore     /mnt/

(3)生成lnt文件,
  从上步骤可以看到执行中会去使用到  /mnt/workspace/include_6735.lnt    
  首先知道在哪个文件路径下,然后在该路径下生成此lnt 文件.
  find -name *.h >2.tmp  这个是生成一个tmp 文件
  需要使用notepad 文本工具处理下,更换-i, 以及去除尾.h 部分,(((/./)|(/))([^/]+$))
  uniq 2.tmp >bootable.lnt   将上面的文件进行去重处理

  


你可能感兴趣的:(C++,c,pc_lint)