你需要的代码静态检查

使用cppcheck给工程代码做静态检查,主要发现了以下几个问题:

1.使用C风格的类型转换

警告如下:

C-style pointer casting detected. C++ offers four different kinds of casts as replacements: static_cast, const_cast, dynamic_cast and reinterpret_cast. A C-style cast could evaluate to any of those automatically, thus it is considered safer if the programmer explicitly states which kind of cast is expected. See also: https://www.securecoding.cert.org/confluence/display/cplusplus/EXP05-CPP.+Do+not+use+C-style+casts.

应该使用C++提供的static_cast, const_cast, dynamic_cast 和 reinterpret_cast 做类型转换,明确转换的类型。

2.迭代器使用后置叠加(叠减)运算符

警告如下:

Prefix ++/-- operators should be preferred for non-primitive types. Pre-increment/decrement can be more efficient than post-increment/decrement. Post-increment/decrement usually involves keeping a copy of the previous value around and adds a little extra code.

迭代器前置++和后置++ 的运行效率是不同的,前置++效率更高,因为后置运算符需要做一个临时的类对象拷贝。

3. 直接在函数参数中使用C风格字符串。

警告如下:

The conversion from const char* as returned by c_str() to std::string creates an unnecessary string copy. Solve that by directly passing the string.

比如一个函数的参数类型是strng,调用时实参直接使用了C风格的字符串,于是就会有以上提示,主要还是因为这里会造成一个不必要的字符串拷贝,降低运行效率。

4. 使用无用的find

很多时候,我们会写下面的find代码,值不等于-1则说明找到了该字符串,

if(std::string::npos != dataStr.find("what"))
    //do something

该代码段会导致报警:

Either inefficient or wrong usage of string::find(). string::compare() will be faster if string::find‘s result is compared with 0, because it will not scan the whole string. If your intention is to check that there are no findings in the string, you should compare with std::string::npos.

代码本身不会出错,但是效率上是不被认可的,如cppcheck所说,如果你希望检查某个字符串是不是某个期望的字符串,那你应该使用compare函数,因为这样更快。

5. 函数参数使用传值而不是传引用

警告如下:

Parameter ‘strShowTime‘ is passed by value. It could be passed as a const reference which is usually faster and recommended in C++.

C++给了引用传参,而你不使用,那就是你的问题了。

6. 构造函数没有使用初始化成员变量列表,而是习惯于写入构造函数体

警告有:

Member variable ‘CActiveComboItemXml::m_phorActivecombo‘ is not initialized in the constructor.

或者如:

When an object of a class is created, the constructors of all member variables are called consecutively in the order the variables are declared, even if you don‘t explicitly write them to the initialization list. You could avoid assigning ‘m_strHrefOnPanReady‘ a value by passing the value to the constructor in the initialization list.

这个问题很普遍,因为很多程序员不习惯在构造函数的初始化列表中初始化成员变量,有的是直接忽略掉,有的则是在构造函数的函数体中去使用赋值运算符赋值,可是这个时候已经不是初始化了,而是赋值阶段了。这是个很危险的习惯!

这几个问题大量出现在cppcheck的问题列表中,是我们经常犯的编程问题,应从代码风格上进行规避。
当然了,可能的错误(警告)是由不当的编码风格和不扎实的C++编码基础导致的,通过静态检查我们自己的代码,可以最大层度的写出易读且不容易出错的代码。

推荐大家使用cppcheck!

原文地址:https://www.cnblogs.com/Stultz-Lee/p/10061365.html

时间: 2024-10-12 21:39:23

你需要的代码静态检查的相关文章

四种java代码静态检查工具

[转载]常用 Java 静态代码分析工具的分析与比较 转载自 开源中国社区 http://www.oschina.net/question/129540_23043 1月16日厦门 OSC 源创会火热报名中,奖品多多哦 »   简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能.特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码

代码静态检查

代码评审技术 代码审查(Code Review)是一种用来确认方案设计和代码实现的质量保证机制,它通过阅读代码来检查源代码与编码规范的符合性以及代码的质量. 代码审查的作用 检查设计的合理性 互为 Backup 分享知识.设计.技术 增加代码可读性 处理代码中的“地雷区” 缺陷检查表 Python代码分析工具 Pylint 是一个 Python 代码分析工具,它用于分析 Python 代码的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8)和有潜在问题的代码. Pyl

C/C++代码静态检查工具Cppcheck在VS2008开发环境中的安装配置和使用

Cppcheck is an analysis tool for C/C++code. Unlike C/C++ compilers and many other analysis tools, it doesn’t detect syntax errors. Cppcheck only detects the types of bugs that the compilers normally fail to detect. The goal is no false positives. Cpp

JAVA代码静态检测之PMD

今天再次想启动Java代码静态检测工具的利用问题,主要再次尝试用了PMD,发现不少代码编码规范问题和好的代码建议,并学到不少自己之前没有注意到的Java方便的基础知识,感觉很不错,把相关明白的好的规则回忆总结下,再以后编码过程中要把随时利用代码静态检查工具,用好代码静态检查工具养成习惯.今天用到的PMD检查规则如下: If表达式必须使用{},无论有多少语句 While循环必须使用{},无论有多少语句 IfElse表达式必须使用{} For循环语句必须使用{} 如果方法返回boolean,那么注意

React Native工程中TSLint静态检查工具的探索之路

建立的代码规范没人遵守,项目中遍地风格迥异的代码,你会不会抓狂? 通过测试用例的程序还会出现Bug,而原因仅仅是自己犯下的低级错误,你会不会抓狂? 某种代码写法存在问题导致崩溃时,只能全工程检查代码,这需要人工花费大量时间Review代码,你会不会抓狂? 以上这些问题,可以通过静态检查有效地缓解! 静态检查(Static Program Analysis)主要是以不运行程序的方式对于程序源代码进行检查分析的技术,而与之相反的就是动态检查(Dynamic Program Analysis),通过实

动态静态检查

编程语?通常能提供以下三种?动检查的?法: l  静态检查: bug在程序运?前发现 l  动态检查: bug在程序运?中发现 l  ?检查: 编程语?本?不帮助你发现错误,你必须通过特定的条件(例如输出的结果)检查代码的正确性. 静态检查好于动态检查好于不检查. ?客派的编程?格的缺点: 在已经编写?量代码以后才测试它们,将所有的细节都放在脑??, 以为??可以永远记住所有的代码, ?不是将它们编写在代码中,认为 BUG 都不存在或者它们都?常容易发现和被修复. ?程派的优点: ?次只写?点点

静态检查lua语法工具luacheck

关于lua的静态检查工具很多,这里着重介绍两种方法: 1.luac.exe 也就是lua的编译器,安装完lua的编译器之后,将自己的代码进行编译这是最好不过的静态检查,当然编译器由于参数的设置,对很多告警并不敏感.所以推荐第二种方法. 2.luacheck 这是google推出的一款针对lua静态检查的开源工具,其安装简单,操作容易,检查严格,参数可控,很适合项目的lua开发. 工具下载及安装:https://github.com/mpeterv/luacheck 我强烈建议你在linux使用这

Jenkins系列——使用checkstyle进行代码规范检查

1.目标 通过jenkins使用checkstyle对代码进行规范检查并生成html报告. 构建采用shell. 2.环境 checkstyle5.7(如果是Linux版本选用tar.gz格式) apache-ant-1.9.9 ①其他默认环境(如jdk)同前 . ②checkstyle没有选择最新版7.6.1是因为7.6.1版本没有将xml格式的报告转换为html报告的xsl文件. ③ant版本不宜选择太高,因为高版本可能需要JDK8+的支持. ④jenkins checkstyle插件主要是

Jenkins系列——使用checkstyle进行代码规范检查【升级版】

1.背景 在<Jenkins系列——使用checkstyle进行代码规范检查>一文中完成了ant实现代码规范检查的例子.但存在以下缺陷: 每个作业都需要配置一个不同的checkstyle ant脚本,而这个脚本中的多数代码是重复的. 报告采取覆盖方式,而我们有时需要保留一定构建次数的报告. 2.分析 使用变量代替ant脚本中变化的路径,这个变量通过ant命令的 -Dxxx=value 的方式传值. 建立名为${BUILD_NUMBER}的目录,将该次构建成功的报告保留在该目录下. 3.环境 同