技术标签: c++ # QT学习记录 c语言 # C++ 开发语言
GitHub下载: https://github.com/danmar/cppcheck
双击安装包,按照安装引导进行安装即可
安装完成之后,可以通过以下方式调用:
cppcheck
来运行;打开你的Qt Creator IDE,在菜单栏中,选择 【工具】 --> 【选项】
选择【环境】–>【外部工具】–>【添加】,外部工具
在新的外部工具配置中,填写以下信息:
C:\software\Cppcheck\cppcheck.exe
;--enable=all %{CurrentProject:Path}
,这个参数会让Cppcheck检查当前项目的所有代码,并启用所有的检查;%{CurrentProject:Path}
,这个设置会让Cppcheck在当前项目的目录下运行;保存配置:【Apply】–>【OK】
打开你的Qt Creator IDE,在菜单栏中,选择 【工具】 --> 【外部】–>【cppCheck】
这些选项可以通过命令行参数进行启用或禁用,以定制cppCheck的行为,例如:
--enable=warning,error
参数来运行cppCheck;开启检查器:--enable=
关闭检查器:--disable=
例如:如果只想启用内存相关的检查,可以使用一下命令:
cppcheck --enable=warning,performance,portability,information,missingInclude --suppress=missingIncludeSystem yourfile.cpp
这个命令将启用所有的警告,性能,可移植性,信息和缺失包含的检查,但是会抑制系统缺失包含的警告。
你可以在Cppcheck的官方手册中找到更多关于如何使用这些参数的信息。手册中详细介绍了每个参数的用途和如何使用它们。
请注意,你需要根据你的需求来选择启用或禁用哪些检查器。不是所有的检查器都适合所有的情况,所以你需要根据你的代码和你想要检查的问题来选择合适的检查器。
Cppcheck的默认检查器包括:
这两类检查器是默认启用的,无法被关闭。
对于其他的检查器,如样式(style)、性能(performance)、可移植性(portability)等,你可以通过–enable参数来启用或禁用。例如,如果你想启用所有的检查器,你可以使用–enable=all参数。
cppcheck --doc
cppcheck --errorlist
在Cppcheck中,内存泄漏检查是默认启用的。这意味着,即使你没有指定任何参数,Cppcheck也会检查内存泄漏。这是因为内存泄漏是一种严重的问题,所以Cppcheck默认总是检查它。
Cppcheck是一个静态分析工具,它可以检查C/C++代码中的多种类型的内存泄漏,包括但不限于:
然而,Cppcheck作为一个静态分析工具,它的检查是基于源代码的,而不是基于程序的运行状态。这意味着它有一些局限性:
因此,虽然Cppcheck是一个非常有用的工具,但它不能替代其他类型的内存泄漏检查工具和技术,例如动态分析工具(如Valgrind)、代码审查、测试等。
Cppcheck可以检查一些性能相关的问题。你可以通过以下命令来启用性能相关的检查:
cppcheck --enable=performance yourfile.cpp
这个命令将启用性能相关的检查,不会启用其他的检查器。
性能检查可以帮助你找到可能影响代码运行效率的问题,例如未使用的变量,未使用的函数返回值,以及可能导致性能下降的编程模式等。
Cppcheck是一个静态分析工具,它可以检查C/C++代码中的各种问题,包括性能问题。以下是Cppcheck可以检查的一些性能问题类别:
然而,Cppcheck的性能检查也有其局限性。以下是一些主要的局限性:
如果你需要进行深入的性能分析,你可能需要使用专门的性能分析工具,如gprof,Valgrind的Callgrind,或者Intel VTune等。
使用--suppress
选项过滤特定的警告:
cppcheck --suppress=missingInclude ./
在 CppCheck 运行结束后,使用自定义脚本对输出结果进行过滤,例如:
可以使用 Python 编写一个脚本,读取 CppCheck 的输出,然后根据自定义规则筛选警告信息。
以下是一个简单的示例:
import subprocess
import sys
def main():
cppcheck_command = "cppcheck --enable=all --xml --xml-version=2 ./"
result = subprocess.run(cppcheck_command.split(), capture_output=True, text=True)
# 在这里添加自定义规则
def custom_filter(error):
# 示例规则:过滤所有包含特定文件名的警告
return "my_special_file.cpp" not in error
# 添加更多规则
def custom_filter_2(error):
# 示例规则:过滤所有包含特定错误类型的警告
return "error type" not in error
# 将所有规则放入一个列表中
filters = [custom_filter, custom_filter_2]
# 对每个规则进行过滤
filtered_errors = result.stderr.splitlines()
for filter_func in filters:
filtered_errors = list(filter(filter_func, filtered_errors))
for error in filtered_errors:
print(error)
if __name__ == "__main__":
main()
这段代码的主要步骤如下:
总的来说,这段代码的目的是运行cppcheck工具,获取其错误输出,然后根据一些自定义的规则来过滤错误信息。
cppcheck是一个C和C++代码的静态分析工具,它可以检查代码中的错误,包括语法错误、未使用的函数、内存泄漏、未初始化的变量等。cppcheck还支持用户自定义规则,这是通过–rule和–rule-file选项实现的。
–rule选项允许你直接在命令行中定义一个规则。规则是一个正则表达式,用于匹配你想要检查的代码模式。例如,如果你想检查所有的printf函数调用,你可以使用以下命令:
cppcheck --rule="printf" myfile.cpp
这将会检查myfile.cpp文件中所有的printf函数调用。
–rule-file选项允许你从一个文件中读取规则。这个文件应该包含一个或多个规则,每个规则一行。例如,如果你有一个名为rules.txt的文件,其中包含以下规则:
printf
scanf
你可以使用以下命令应用这些规则:
cppcheck --rule-file=rules.txt myfile.cpp
这将会检查myfile.cpp文件中所有的printf和scanf函数调用。
注意,cppcheck的规则是正则表达式,所以你可以使用正则表达式的所有功能来定义你的规则。例如,你可以使用.*来匹配任何字符,[a-z]来匹配任何小写字母,等等。
最后,cppcheck的规则检查是大小写敏感的,所以printf和Printf是两个不同的规则。如果你想忽略大小写,你可以使用正则表达式的i标志,例如(?i)printf将会匹配printf、Printf、PRINTF等等。
rule自定义规则示例
以下是一些可能的Cppcheck自定义规则的例子:
bash malloc\
( 这个规则会匹配到任何使用malloc函数的代码。在C++中,通常推荐使用new而不是malloc,因为new会自动调用对象的构造函数。bash printf\
( 这个规则会匹配到任何使用printf函数的代码。在C++中,通常推荐使用cout而不是printf,因为cout是类型安全的。bash int\s+\w+
; 这个规则会匹配到任何定义了一个整数变量但没有使用它的代码。未使用的变量可能是一个错误的信号,因为它可能意味着你忘记了使用这个变量。bash delete\s+\w+;\s*(?!.*\1\s*=\s*nullptr;)
这个规则会匹配到任何使用delete但没有将指针设为nullptr的代码。在C++中,删除一个指针后,通常推荐将其设为nullptr,以防止悬挂指针。bash class\s+\w+\s*{\s*(public|protected):\s*virtual\s+\w+\s*\(\)\s*;\s*(?!.*virtual\s+~\1\(\)\s*;)
这个规则会匹配到任何定义了虚函数但没有虚析构函数的类。在C++中,多态基类应该总是有一个虚析构函数,以防止在删除派生类对象时出现未定义的行为。bash std::cout\s*<<\s*.*std::endl
这个规则会匹配到任何使用std::endl的代码。在C++中,std::endl不仅会插入一个换行符,还会刷新输出流。如果你不需要立即刷新输出流,使用\n可能会更高效。请注意,这些规则可能会产生一些误报,因为它们可能会匹配到一些合法的代码。如果你需要更精确的检查,你可能需要创建一个更复杂的正则表达式,或者使用一个更高级的静态代码分析工具。
int main()
{
int *array = new int[100];
return 0;
}
在这段代码中,我们在main()函数中分配了一段内存,但在函数结束时没有释放。
然后,我们使用 Cppcheck 来检查这段代码。
cppcheck --enable=all memory_leak.cpp
最后,Cppcheck 的输出可能类似下面这样:
Checking memory_leak.cpp... [Memory_leak.cpp:4]: (error) Memory leak: array
int main()
{
int *ptr = nullptr;
*ptr = 10;
return 0;
}
在这段代码中,我们创建了一个空指针ptr,然后试图对其进行解引用。这将导致未定义的行为。
我们可以使用Cppcheck来检查这段代码:
cppcheck --enable=all null_pointer.cpp
Cppcheck的输出可能类似下面这样:
Checking null_pointer.cpp...
[null_pointer.cpp:3]: (error) Null pointer dereference: ptr
int main()
{
int array[10];
array[10] = 0;
return 0;
}
在这段代码中,我们试图访问数组的第11个元素,但数组的大小只有10。这将导致未定义的行为。
我们可以使用Cppcheck来检查这段代码:
cppcheck --enable=all array_out_of_bounds.cpp
Cppcheck的输出可能类似下面这样:
Checking array_out_of_bounds.cpp...
[array_out_of_bounds.cpp:3]: (error) Array 'array[10]' accessed at index 10, which is out of bounds.
int main()
{
int unused = 0;
return 0;
}
在这段代码中,我们声明了一个变量unused,但没有在任何地方使用它。
我们可以使用Cppcheck来检查这段代码:
cppcheck --enable=all unused_variable.cpp
Cppcheck的输出可能类似下面这样:
Checking unused_variable.cpp...
[unused_variable.cpp:2]: (style) Unused variable: unused
这些只是Cppcheck可以检测的一些错误类型的示例。Cppcheck还可以检测许多其他类型的错误和潜在问题。
Cppcheck是一个非常有用的工具,它可以检测C++代码中的许多常见错误和潜在问题。然而,像所有工具一样,Cppcheck也有其局限性。以下是一些主要的局限性:
总的来说,虽然Cppcheck是一个非常有用的工具,但它不能替代其他的代码审查和测试工具。你应该将Cppcheck作为你的工具箱中的一个工具,而不是唯一的工具。
文章浏览阅读220次。指定文件字符集为utf-8在文件头部加入以下代码:import sysreload(sys)sys.setdefaultencoding('utf-8')_unicodeencodeerror: 'ascii' codec cant encode character '\u2019' in position
文章浏览阅读1.2k次。 字面释义:UE(User Experience) : 用户体验 UI(User Interface) : 用户界面 UCD(User-Centered Design) :以用户为中心的设计 UED(User-Experience Design) :用户体验设计 UI(User Interface)即用户界面,也称人机界面。是指用户和某些系统进行交互方法的集_ued,ui,,ue区别
文章浏览阅读780次。Java接口自动化框架系列05:Web接口自动化Demo例子详细介绍1、提取到要测试的接口信息,并分析接口1.1、找到到你需要测试的接口,例如:新增角色,查询角色,删除角色例如:https://10.1.1.104/uim/doc.html1.1.1、新增角色接口地址:/uim/v1/role/add 请求方式:POST请求示例:{ "moduleName": "", "monitorEnabled": 0}响应示例:{ "code": 0, _java接口自动化案例
文章浏览阅读3.1w次,点赞73次,收藏667次。数字图像处理(四)—— 图像增强图像增强的定义图像增强方法一、图像增强的点运算(一)灰度变换1. 线性变换2. 分段线性变换3. 非线性灰度变换对数变换指数变换(二) 直方图修整法1. 直方图均衡化2. 直方图规定化二、图像的空间域平滑(一)局部平滑法1. 超限像素平滑法2. 灰度最相近的K个邻点平均法3. 最大均匀性平滑4. 有选择保边缘平滑法5. 空间低通滤波法6. 中值滤波三、图像空间域锐化(一)梯度锐化法Sobel 与 Prewitt 算子(二)Laplacian 增强算子(三)高通滤波法四、图像的_图像增强
文章浏览阅读1.9w次,点赞18次,收藏135次。1.deconfig 文件:一般由平台厂商提供,内核编译用做.config的参考,注意:如果,缺少该文件,无法进行编译。文件位于:/kernel/../arch/arm/configs/xxx_defconfig2.kconfig 分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make men_make menuconfig .config
文章浏览阅读3k次。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> table { _html增删行按钮
文章浏览阅读1k次。下载examples of PDF files - 5.0 MB 下载C# class library (DLL) - 292.2 KB 下载demo project (including DLL) - 5.7 MB 下载source - 4.9 MB介绍PDF文件编写器c#类库PdfFileWriter允许您直接从。net应用程序创建PDF文件。这个库使您无法了解PDF文件结构的细节。要使用该库,您需要添加一个对附加的pdffilewritl .dll类库文件的引用,在使用该库并将pdffile_c# pdf annotation
文章浏览阅读5.1k次。物化视图虽然能够自动更新数据,但是会带来一些性能上的损失,尤其是在基础表数据量较大的情况下。因此,在设计物化视图时,需要考虑这个因素,同时选择合适的刷新机制来平衡性能和数据实时性的需求。当基础表有数据插入时,触发器会自动插入相应的数据到物化视图中。)是一种特殊的表,它能够在底层数据更新后,自动更新自己的数据。数据更新包括两个方面的变化:基础表的数据修改和基础表的数据新增。另外,我们也可以手动刷新物化视图,甚至可以使用一些定时手段,实时或定时去触发它。如果基础表的数据修改,物化视图会自动更新。_clickhouse 创建物化视图详解
文章浏览阅读6.7k次,点赞2次,收藏8次。redis+keepalivede主从高可用实操之前有写过redis+sentinel的哨兵机制主从的切换,这一次多了一个keepalived,是为了能够方便项目只支持一台访问,可是又要高可用的情况下,就可以执行此方案。本次主要讲的就是keepalived的配置,如何才能做到单台访问而实现高可用!_redis多台keepalived
文章浏览阅读1.4k次,点赞2次,收藏13次。这是一篇译文,译文首发于 事件驱动架构设计,转载请注明出处!这篇文章是 软件架构演进 一个有关 软件架构 系列文章中的一篇。这些文章,主要是我学习软件架构、对软件架构的思考及使用方法的记录。相比于这个系列的前几篇文章,本篇文章可能看来更有意义。采用设计驱动开发应用程序的实践,可以追溯到 1980 年左右。我们可以在前端或者后端采用事件..._事件框架的设计
文章浏览阅读4.2k次。//============================================================================// Name : wgb.cpp// Author : wgb// Version :// Copyright : Your copyright notice// Description : He_read pcd failed
文章浏览阅读591次。安装cnpmnpm install -g cnpm查看镜像地址npm get registry https://registry.npmjs.org/更换镜像地址为淘宝的npm config set registry http://registry.npm.taobao.org/或者一步完成npm install -g cnpm --registry=https://registry.npm.taobao.org使用cnpm安装vue-clicnpm install -g @v_如何注册cnpm