代码质量与静态检查

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
代码质量与静态检查
目录
什么是代码质量 如何保证代码质量 提高代码质量的方法 静态检测 PC-Lint 动态检查 代码度量 程序员与代码质量
什么是代码质量
代码的最终载体是软件产品(Software); 软件质量(Software Quality)最终体现为代码质量(Code Quality);
程序员与代码质量
没有一种编程语言能阻止程序员写出糟糕的程序来,不管这种语 言结构有多良好。 -- Larry Flon
永远要这样写代码,好像最终维护你代码的人是个狂暴的、知道 你住在哪里的精神病患者。 -- Martin Golding
优秀的工具可以使优秀的程序员更优秀,但无法使糟糕的程序员 做到优秀。 -- The Practise of Programming 代码质量不能完全依靠人来保证,但最终还是依靠人来保证。
靠人,靠程序员。但人往往是最不可靠的东西。 东西才可靠,这东西就是工具。
提高代码质量方法
两大法宝: ※ 测试 ※ 检查 测试后续再交流,本次主要交流代码检查部分;
代码检查的目的不单是为了提高软指标,已深入到程序逻辑、内存检测、 复杂度、优化建议等高级层面,从而反过来影响程序功能和性能。
代码检查分为: ※ 静态检查:对程序代码的检查; ※ 动态检查:程序运行时检查; 动态检查着重于内存和资源检查。
PCLINT
库文件检查设置
PCLINT
强类型检查设置(Strong Types) C/C++语言本身即为强类型语言,但由于typedef存在,可能会导致 编译器对某些类型匹配检测失效; Pclint通过-strong和-index选择配置强类型检测; -strong( flags [, name] ... ) flags取值: A:对强类型变量进行赋值时进行类型检测,可带参数i,r,p,a,c,z; X:把强类型变量赋给其他变量时进行类型检测; J:当强类型与其它类型进行如下的二进制操作时进行检查,J的参数: e 忽略==、!=和?:操作符 r 忽略>、>=、<和<= o 忽略+、-、*、/、%、|、&和^ c 忽略该强类型与常量进行以上操作时的检查 z 忽略该强类型与Zero进行以上操作时的检查 还存在Bblf等选项;
PCLINT
一个简单的例子:
可以看到pclint检查出一个 warning: 符号i未初始化;
PCLINT
Pclint对检查到的代码问题进行分级, 目前主要包含如右图几类信息:
每一个问题pclint都会具有一个对应的 编码,基本对应关系如下图:
PCLINT
针对Pclint的消息级别,通常有如下特征: Syntax Errror:语法错误,通常是错误,需要修改; Internal Error:Pclint内部错误,一般不会出现; Fatal Error: 致命错误,通常是文件错误或溢出错误; Warning:告警,pclint检测的主要目的,通常都是语法上正 确但可能会导致程序错误的代码; Info:提示信息,通常和编程风格有关,存在错误的可能性; Elective Notes:可选信息,一般无需关注; Pclint的错误告警级别分为0,1,2,3,4, 数字越小错误越严重, 默认级别是3(info),也是推荐的级别; 可使用-wLevel修改消息级别(在options.lnt文件中添加); 如-w2,不输出无关Info消息;
PCLINT
常用配置: -wLevel 设置消息输出级别 -wlib(Level) 设置库消息级别,通常设置为-wlib(0) -e# 禁止输出编号为#的消息 +e# 恢复输出编号为#的消息 # 编号支持元字符,?代表任意一个字符,*代表任意多个字符
+(-)e设置均可通过注释植入到代码,如: /*lint -e530 */ lint前不能有空格,注释长度不大于80 典型形式: /*lint -e530 */ 从当前行以后禁止530输出; /*lint -e(530) */ 为下一个表达式禁止530,其后自动恢复; /*lint --e(530) */为整个表达式禁止530,其后自动恢复 /*lint -e{530} */为下一个语句或声明禁止530,其后自动恢复 /*lint --e{530} */ 为当前{}语句块禁止530,其后自动恢复 /*lint !e530 */ 仅对当前行禁止530
PCLINT
Pclint安装完成后,下载最新的补丁包,将其PATCH到最新版本。 安装完成后,会提示是否需要设置; 按照GUI界面,一路设置即可; 主要设置了编译环境,编译器, 内存模型,使用的库,以及设置 相关的库文件目录等; 关键配置文件: std.lnt options.lnt
将pclint主目录设置到系统PATH;
PCLINT
pclint与开发环境集成 pclint可集成到VS、UE、SourceInsight等支持外部工具的开发 环境;
集成到SourceInsight 点击Options->Custom Commands, 按Add, 按照右图输入参数, 完成后通过Menu菜单定制 该命令
PCLINT
集成到UE 点击“高级->工具配置”, “插入”, 按照右图输入参数; 确定完成后在UltraEdit的 “高级”菜单中会增加一个 “PC-lint Check Current File” 菜单项
功能测试(UT/ST)、性能测试、可靠性测试
※ 保证健壮性
压力测试、异常测试
※ 保证可测试性
架构设计、子系统设计、模块设计、接口设计
※ 保证可读性
编程规范、代码风格
※ 保证可维护性/可扩展性
如何保证代码质量
软件测试的意义 发现更多的BUG,减少错误出现概率,保证软件产品是合格的产品; 如何从合格到达优秀,成为高质量软件产品? 着重体现在代码的软指标上,可测,可读,可维护,可扩展; 设计的重要性 设计可以部分保证可测、可维护、可扩展; 剩下的部分依靠什么来保证?
PCLINT
高级消息输出设置 -efile(#, file[,file]…) 禁止文件相关的错误; -efunc(#,symbol[,symbol]…) 禁止函数内的错误; -esym(#,symbol[,symbol]…) 禁止某个符号的错误; -emacro(#,symbol,..) 禁止某个宏的错误; -etype, -estring, -etemplate, -elib, -efreeze…… 总之,pclint提供精细化的消息输出控制。
动态检查
代码动态检查主要进行内存和资源检查,通过在开辟和释放操作中进
行插桩或命令替换,进行内存和资源统计分析;
典型工具:Rational Purify, Valgrind
代码度量(Code Metric)
• 代码覆盖率 Rational PureCoverage • 圈复杂度(Cyclomatic Complexity) Cppncss
对软件产品的质量要求就间接的提出了对代码的质量要求; 问:什么高质量的软件产品? 答:符合用户需求、运行稳定、性能优异、易维护、易扩展等; 间接引申出程度代码的质量要求: ※ 可用性:正确、有效 ※ 健壮性:可靠、容错 ※ 可测试: ※ 可读: ※ 可维护: ※ 可扩展:
如何保证代码质量
※ 保证可用性
变量类型和对齐设置 -sb# 一个字节的位数,默认-sb8 -si# int类型的字节数,默认-sb4,某些平台需要修改 -so#, -sc#, -sl#, -sp#, -sw#......
-ai# int对齐字节数 -al# long对Fra Baidu bibliotek字节数 类型与-s一致,和对齐相关的消息为Notes 958,959
PCLINT
强类型检查设置 -index( flags, ixtype, sitype [, sitype] ... ) flag取值: c:使用ixtype和常量索引sitype; d:允许在不使用ixtype的情况下指定数组的长度
PCLINT
PCLINT的其他功能 变量值跟踪(Value Tracking) SEMANTICS 多线程检测 (Multi-Thread) 格式检测 (Format Checking) 赋值顺序检测 (Order of Evaluation) 弱定义检测 (Weak Definials) 缩进检测 (Indentation Checking) 常量检测 (Const Checking) …… 更多详细功能,请参考pclint使用手册;
谢 谢!
静态检查
静态检查 静态检查能检查出哪些问题? 变量未初始化 空指针引用 数据类型不匹配 返回局部变量 数组字符串边界溢出 内存泄露 …… 静态检查可以通过人工进行:代码走读,代码检视。 也可以通过工具进行:编译器,专业的代码检查工具, 如pclint,splint,coverity
PCLINT
PC-lint(FlexeLint) Gimpel Software. 事实上的工业标准,pclint目前版本9.00i 需要安装,安装后目录结构如右图, 运行lint-nt.exe可见帮助信息;
相关文档
最新文档