Windows下 C++代码检测工具

最近在查阅一些windows系统下的C++代码及性能检测工具, 按照检测类别分别静态检测和动态检测。

静态检测: 在程序没有被实际执行的情况下执行的计算机软件分析,大部分是对源代码的分析和检测。

动态检测: 通过在真实或虚拟处理器上执行程序来执行的计算机软件的分析。

动态检测范围包括:代码覆盖率分析、 内存检测、安全性分析、并发分析、性能分析等。

今天的文章主要针对 静态检测 及 动态检测。

目录

win下C++ 静态代码检测

​​​​​工具一:Tscancode(推荐)

工具二:cppcheck

工具三: Visual stdio中代码分析

工具四: cpplint(推荐)

win下C++动态检测

               代码覆盖率检测:OpenCppCoverage (推荐)

      内存检测方法:

工具一: windows CTR检测

工具二: vld检测(推荐)

工具三: Dr Memory


 

win下C++ 静态代码检测

  • ​​​​​工具一:Tscancode(推荐)

 腾讯开源软件,地址:https://github.com/Tencent/TscanCode , 操作界面如下, 使用简单,检查结果一目了然。目前有腾讯开发维护。

  • 工具二:cppcheck

开源,地址:http://cppcheck.net/ , cppcheck检查结果如下:

关于cpcheck 与 tscancode 及其他主流静态检测工具的对比可参考: https://blog.csdn.net/lovespring116/article/details/73504190, 本文推荐使用 Tscancode对代码进行静态检测

  • 工具三: Visual stdio中代码分析

  • 工具四: cpplint(推荐)

cpplint:根据google代码风格进行检查,介绍:https://en.wikipedia.org/wiki/Cpplint, 可以嵌入到vs程序中, 下载地址: https://pypi.org/project/cpplint/, 使用参考: https://blog.csdn.net/liulihuo_gyh/article/details/79986685

需要下载python,建议下载 python 2.x版本,本文使用 2.7.0,下载地址 https://www.python.org/downloads/release/python-270/  Windows X86-64 MSI Installer, cpplint 嵌入到vs中操作如下, 双击输出中的具体行,可以定位到源文件中。

 

win下C++动态检测

代码覆盖率检测:OpenCppCoverage (推荐)

开源地址: https://github.com/OpenCppCoverage/OpenCppCoverage   如果想在vs中插件运行, 工具--扩展和更新, 在联机中搜索 OpenCppCoverage。使用时在工具下可以直接运行opencppcoverage。 如果使用命令行运行可以添加 opencppcoverage的系统环境变量, 在cmd中通过命令使用。检测结果如下:红色代码未执行, 绿色代码已执行。

内存检测方法:

工具一: windows CTR检测

官网介绍: https://docs.microsoft.com/zh-cn/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2015

缺点:只能在debug模式下使用,release版本不支持。


#include <iostream>
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>  
#include <crtdbg.h>  

#ifdef _DEBUG
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
// Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the
// allocations to be of _CLIENT_BLOCK type
#else
#define DBG_NEW new
#endif

int main()
{
	printf("this is a test in main\n");

	int *a = DBG_NEW int[100];

	system("pause");
	_CrtDumpMemoryLeaks();

	return 0;
}

debug下的输出: 

Detected memory leaks!
Dumping objects ->
consoleapplication3\consoleapplication3\main.cpp(28) : {68} normal block at 0x0136D330, 400 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.

工具二: vld检测(推荐)

 官网介绍:   https://kinddragon.github.io/vld/, github地址: https://github.com/KindDragon/vld

 使用方法, 到https://kinddragon.github.io/vld/ 下载 vld,安装后在安装目录下生成  include  lib  bin等文件, 新建工程,将以上文件配置到工程中。

#include <iostream>
#define VLD_FORCE_ENABLE  //VLD_FORCE_ENABLE宏需要定义在 vld.h 之前
#include "vld\include\vld.h"
#include "vld\include\vld_def.h"

int main()
{
	printf("file: %s,  line:%d \n", __FILE__,  __LINE__);
	int *b = new int[1000];
	system("pause");
	return 0;
}

或者在预处理宏  中添加  VLD_FORCE_ENABLE, 如下图:

                                    

结果输出:

Visual Leak Detector read settings from: D:\Program Files (x86)\Visual Leak Detector\vld.ini
Visual Leak Detector Version 2.5.1 installed.
file: main.cpp,  line:8
请按任意键继续. . .

程序结束运行后输出如下, 双击工程源文件对应的泄露可以直接跳转到该文件。

WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x00123018: 4000 bytes ----------
  Leak Hash: 0x11C3C7BA, Count: 1, Total 4000 bytes
  Call Stack (TID 32116):
    MSVCR120.dll!operator new()
    d:\work\code\testcode\consoleapplication2\consoleapplication2\main.cpp (10): ConsoleApplication2.exe!main()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!RtlAreBitsSet() + 0x88 bytes
    ntdll.dll!RtlAreBitsSet() + 0x58 bytes
  Data:
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA    0D F0 AD BA     ........ ........
Visual Leak Detector detected 1 memory leak (4000 bytes).
Largest number used: 4000 bytes.
Total allocations: 4000 bytes.
Visual Leak Detector is now exiting.

工具三: Dr Memory

官网介绍:http://www.drmemory.org/, 使用介绍:http://drmemory.org/docs/page_options.html

Dr Memory是基于DynamoRIO开发的跨平台内存调试程序, 支持 Windows  Linux  Android和Mac。

DynamoRIO 是一个跨平台的二进制插桩程序,支持 Windows  Linux  Android等。

工具对比说明: 工具一需要在程序 debug 模式下使用, vld和 drmemory 在debug 和 release 下都可以检测,不过如果工程较大,drmemory的全量检测会很卡,指定参数 -leaks_only  可以只检测内存问题。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值