最近在查阅一些windows系统下的C++代码及性能检测工具, 按照检测类别分别静态检测和动态检测。
静态检测: 在程序没有被实际执行的情况下执行的计算机软件分析,大部分是对源代码的分析和检测。
动态检测: 通过在真实或虚拟处理器上执行程序来执行的计算机软件的分析。
动态检测范围包括:代码覆盖率分析、 内存检测、安全性分析、并发分析、性能分析等。
今天的文章主要针对 静态检测 及 动态检测。
目录
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检测
缺点:只能在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 可以只检测内存问题。