VS2005中检测和更正 C/C++ 代码缺陷

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
VS2005中提供的检测方法:
1 IDE(集成开发环境)集成
2 #pragma 支持
3 批注支持
4 作为签入策略的一部分运行分析工具
5 Team System 与 Team Build 的集成
6 命令行支持

代码分析工具用于检测常见的编码错误,例如缓冲区溢出、内存未初始化、空指针取消引用,以及内存和资源泄露。

为 C/C++ 代码启用代码分析
在 Visual Studio 中打开一个项目。

在“项目”菜单上单击“属性”。

单击“代码分析”。

在“启用 C/C++ 代码分析”列表中,选择“是(/analyze)”,然后单击“确定”。

禁用 C/C++ 代码分析
在 Visual Studio 中打开一个项目。

在“项目”菜单上单击“属性”。

单击“代码分析”。

在“启用 C/C++ 代码分析”列表中,选择“否”,然后单击“确定”。


若要管理警告状态,请在单独的头文件中列出所有代码分析警告。将头文件包括在源文件中。使用 warning pragma 重写头文件中的设置。

启用或禁用代码分析警告
创建一个头文件,其中列出所有代码分析警告和这些警告的初始状态,如下面的代码所示:

// WarningState.h
   #pragma warning ( enable : 6001 )
   #pragma warning ( disable : 6011 )
// more warnings here
// end of file
将 WarningState.h 包括在应用程序头文件中。在本例中,MyApplication.h 代表头文件。

// MyApplication.h file
   #include "WarningState.h"
// ...
// end of file
将 MyApplication.h 文件包括在源代码文件中。在本例中,MyApplication.cpp 代表源文件。

// MyApplication.cpp file
#include "MyApplication.h"
若要修改警告状态,请在 .cpp 文件中使用 pragma 警告说明符,如下面的代码所示:

#pragma warning ( enable : 6011 )
#pragma warning ( disable : 6001 )    
若要在 C++ 中批注代码,必须首先包括 SourceAnnotations.h 文件,然后使用 vc_attributes 命名空间。(其他的批注属性:http://msdn2.microsoft.com/zh-cn/library/ms182037(VS.80).aspx)
 在 C++ 中批注代码
 向项目头文件添加 #include <CodeAnalysis/SourceAnnotations.h> 文件。             
 然后,添加 using namespacevc_attributes; 语句。
 示例
 添加要包括的文件和命名空间后,批注 C++ 代码,如下面的代码所示:       
 // MyCode.h
#include <CodeAnalysis/SourceAnnotations.h>
using namespace vc_attributes;
class CMyClass
{
public:
       void f ( [Pre ( Valid = Yes )] int *pWidth );
// code ...
};

// MyCode.cpp
#include "MyCode.h"
void CMyClass::f ( [Pre (Valid = Yes)] int pWidth )
{
}
在 C 中,必须对枚举属性值使用 SA_ 前缀。在 C++ 中,SA_ 前缀是可选的。

您可以在“错误列表”或输出窗口中查看代码分析警告。在“错误列表”中,可以对警告排序,并通过双击警告在代码编辑器中来查看导致该警告的代码行。也可以选择一个警告,然后按 F1 以查看该警告的帮助信息。
(C/C++ 代码分析警告:http://msdn2.microsoft.com/zh-cn/library/a5b9aa09(VS.80).aspx)
 
查看代码分析警告     

在“视图”菜单上指向“其他窗口”,然后选择“错误列表”。


本演练演示如何通过使用 C/C++ 代码分析工具来分析 C/C++ 代码以查找潜在的代码缺陷。

演练:对 C/C++ 代码进行缺陷分析  (实例下载: http://msdn2.microsoft.com/zh-cn/library/ms182029(VS.80).aspx)

在本演练中,逐步完成使用代码分析来分析 C/C++ 代码以查找潜在代码缺陷的过程。

您将完成下列步骤:

在本机节点上运行代码分析。

分析代码缺陷警告。

将警告视为错误。

批注源代码以改进代码缺陷分析。

先决条件

Visual Studio 2005 Team System。

演示示例的副本。

对 C/C++ 进行基本了解。

对本机代码运行代码缺陷分析

在 Visual Studio 2005 Team System 中打开演示解决方案。

演示解决方案现在将出现在解决方案资源管理器中。

在“生成”菜单上单击“重新生成解决方案”。

将生成解决方案,并且不出现任何警告或错误。

在解决方案资源管理器中,选择 CodeDefects 项目。

在“项目”菜单上单击“属性”。

将显示“CodeDefects 属性页”对话框。

单击“代码分析”。

从“启用 C/C++ 代码分析”下拉列表中,选择“是(/analyze)”,然后单击“确定”。

重新生成 CodeDefects 项目。

代码分析警告显示在输出窗口中。

分析代码初始化缺陷警告

在“视图”菜单上单击“错误列表”。

取决于您在 Visual Studio 2005 Team System 中选择的开发人员配置文件,您可能需要指向“视图”菜单上的“其他窗口”,然后单击“错误列表”。

在“错误列表”中双击下列警告:

警告 C6230:语义不同的类型之间的隐式强制转换: 在 Boolean 上下文中使用 HRESULT。

代码编辑器显示导致在函数 boolProcessDomain() 中出现警告的代码行。该警告指示“if”语句中正在使用 HRESULT,而原本应使用布尔值结果。

通过使用 SUCCEEDED 宏来更正该警告。代码看起来应类似下面这样:

if (SUCCEEDED (ReadUserAccount()) )
在“错误列表”中双击下列警告:

警告 C6282:运算符不正确: 在测试上下文中执行了常数赋值。Was == intended?(事实是否确实像预计的那样?)

通过测试是否等同来更正该警告。代码看起来应类似下面这样:

if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '//'))
将警告视为错误

在 Bug.cpp 文件中,将下面的 #pragma 语句添加到文件的开头,将警告 C6001 视为错误:

#pragma warning (error: 6001)
重新生成 CodeDefects 项目。

在“错误列表”中,C6001 现在显示为一个错误。

通过将 i 和 j 初始化为 0,更正“错误列表”中的其余两个 C6001 错误。

重新生成 CodeDefects 项目。

将生成项目,并且不出现任何警告或错误。

更正 annotation.c 中的源代码批注警告

在解决方案资源管理器中,选择 Annotations 项目。

在“项目”菜单上单击“属性”。

将显示“Annotations 属性页”对话框。

单击“代码分析”。

从“启用 C/C++ 代码分析”下拉列表中,选择“是(/analyze)”,然后单击“确定”。

重新生成 Annotations 项目。

在“错误列表”中双击下列警告:

警告 C6011:正在取消 NULL 指针“newNode”的引用。

该警告指示调用方检查返回值失败。在这种情况下,调用 AllocateNode 可能会返回一个 NULL 值(有关 AllocateNode 的函数声明,请参见 annotations.h 头文件)。

打开 Annotation.c 文件。

若要更正该警告,请使用“if”语句来测试返回值。代码看起来应类似下面这样:

if (NULL != newNode)

{

newNode->data = value;

newNode->next = 0;

node->next = newNode;

}

重新生成 Annotations 项目。

将生成项目,并且不出现任何警告或错误。

使用源代码批注

通过使用 Pre 和 Post 条件,批注函数 AddTail 的形参和返回值,如下面的示例所示:

[SA_Post (Null=SA_Maybe)] LinkedList* AddTail

(

[SA_Pre(Null=SA_Maybe)] LinkedList* node,

int value

)

重新生成 Annotations 项目。

在“错误列表”中双击下列警告:

警告 C6011:正在取消 NULL 指针“node”的引用。

该警告指示传递给函数的节点可能为空。

若要更正该警告,请使用“if”语句来测试返回值。代码看起来应类似下面这样:

  . . .
  LinkedList *newNode = NULL;
  if (NULL == node)
  {
       return NULL;
      . . .
  }
重新生成 Annotations 项目。

将生成项目,并且不出现任何警告或错误。


 

HALCON联合C#检测表面缺陷——VS界面制作 这一节。主要介绍HALCON联合C#检测表面缺陷检测的界面编辑,合理框架,在后期项目的修改编辑中会大大降低我们花费的时间,同时,代码运行的效率也会大大提高 阅读详情

相关推荐

C++编程中的十大低级错误

C++编程中需要避免的10大编程错误,可用于代码检查。

VS报错C6011:取消对NULL指针的引用 解决方法

解决VS报错C6011:取消对NULL指针的引用

猫的博客 6159

编译Professional Rootkits 源代码 问题解决

1、路径中不要有空格 2、提示找不到头文件sourceannotations.h。把C:\Program Files\Microsoft Visual Studio 10.0\VC\include\下的CodeAnalysis 文件夹复制到C:\WinDDK\7600.16385.1\inc\api 下即可...

weixin_34221773的博客 169

MS VS2005/08总是弹出调试解决办法

<br />上网的时候,ie总是出现visual studio实时调试器,非常烦人,所以自己在网上搜索了一下,发现有很多装了vs2008的朋友都有这样的经历。于是将其解决办法贴出以便能对有这种问题的朋友会有帮助。<br />网页经常都会有错误,没安装VS2008之前一样也有,只不过不是以这种形式显示,而是在左下角出现金黄色盾牌,提示错误,安装了VS2008出现Visual Studio 实时调试器是因为VS2008对错误脚本进行调试,所以就出现了这样的情况。<br />解决的方法很简单,允许注册表编辑器,删

赏金的专栏 648

C/C++编程报错合集(1):未定义标识符“count”,C6001:未使用初始化的内存,C6011:取消对NULL指针“s”的引用

报错原因:在C++中,cout是标准输出流对象,用于将文本信息输出到控制台,其声明定义在iostream中,需要引入相应的头文件语句。

颜安青的小世界 2265

C++随笔分类列表(基础)

VS Studio: VS快捷键:http://www.cppblog.com/mzty/archive/2006/04/26/6306.html VC Studio 使用技巧大全http://www.cppblog.com/mzty/archive/2005/12/06/1566.html Visual C++ 编译器选项http://www.cppb...

weixin_34294649的博客 121

(轉貼) 夢在天涯C++隨筆分類列表 (C/C++)

轉貼自 http://www.cppblog.com/mzty/archive/2007/03/02/19109.html C++随笔分类列表:VS Studio: VC Studio 使用技巧大全  http://www.cppblog.com/mzty/archive/2005/12/06/1566.htmlVisual C++ 编译器选项  http://www.cppblog.com/m...

weixin_34364135的博客 811

C++ Programmer's Cookbook C++基础C++高级

From:http://www.cppblog.com/mzty/archive/2007/08/13/29922.html ------------------------------------------------------------------------------------------ C++随笔分类列表(基础): VS St...

墨鱼菜鸡 365

C++随笔分类列表

VS Studio: VC Studio 使用技巧大全  http://www.cppblog.com/mzty/archive/2005/12/06/1566.htmlVisual C++ 编译器选项  http://www.cppblog.com/mzty/archive/2006/08/17/11336.html调试breakpoint高级  http://www.cppblog.com/m

706

C++随笔分类列表(基础):

C++随笔分类列表(基础) C++随笔分类列表(基础): VS Studio:  VS快捷键:http://www.cppblog.com/mzty/archive/2006/04/26/6306.html VC Studio 使用技巧大全  http://www.cppblog.com/mzty/archive/2005/12/06/1566.html Visual C

KEEP的博客 377

VC++ 6.0 现代系统安装与兼容性配置实战指南

在软件开发领域,集成开发环境(IDE)是程序员的核心工具,其版本迭代与系统兼容性直接影响开发效率。Visual C++ 6.0(VC6)作为一款经典的C++开发工具,其核心原理基于MFC框架Windows API,为Windows桌面应用开发提供了稳定基础。尽管现代IDE功能丰富,但VC6在工业控制、嵌入式上位机及遗留系统维护等特定场景中,因其轻量、稳定对老旧代码的完美支持,仍具有不可替代的技术价值。本文聚焦于解决VC6在现代操作系统(如Windows 10/11)上的实际部署难题,涵盖从获取纯净安装包

weixin_30448603的博客 325

警告 C6011 取消对 NULL 指针“newcode”的引用。

void SListPushBack(SLTNode** pphead, SLTDateType x) { SLTNode* newcode = (SLTNode*)malloc(sizeof(SLTNode)); newcode->data = x; newcode->next = NULL; } 解决方法如下:就下了一个判断语句,是否为空,如果为空就直接退出 void SListPushBack(SLTNode** pphead, SLTDat...

Monkey_cai的博客 5339

C6011:取消对NULL指针“_____“的引用解决办法

malloc之后没有检查是不是空间不够返回了空指针NULL //向内存申请10个整形的空间 //p中存放开辟空间的地址 int* p=(int*)malloc(10*sizeof(int)); //开辟失败,内存不够,返回空指针NULL if(p==NULL) { //打印错误原因的一个方式 printf("%s\n",strerror(errno)); //Not enough space } .

aiqq136的博客 1万+

解决warning:C6001,异常:读取访问权限冲突0xCDCDCDCD的问题 (C++单链表练习题)

今天在做天勤的数据结构 第二章线性表练习题,上机操作的时候遇到了一个问题,到网上搜了一下,发现有人也遇到了一样的问题(只是没解决)。于是自己捣鼓了一会儿,最后不到10分钟就想出来了,原来是个简单的内存未定义的问题。 //(6)有一个递增非空单链表,设计一个算法删除值域重复的结点,例如{1,1,2,3,3,3,4,4,7,7,7,9,9,9},删除后变成{1,2,3,4,7,9} void delete_surplus_node(SLNode* L) { SLNode* l = L->next, *l

qq_45135120的博客 9584

c++ 指针_C/C++学习笔记——C提高:指针强化

指针是一种数据类型指针变量指针是一种数据类型,占用内存空间,用来保存内存地址。void test01(){ int* p1 = 0x1234; int*** p2 = 0x1111; printf("p1 size:%d\n",sizeof(p1)); printf("p2 size:%d\n",sizeof(p2)); //指针是变量,指针本身也占内存空间,指针也可以被赋...

weixin_39930276的博客 249

c6011错误

版权声明:本文为CSDN博主「一只小松许️」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/ye_yumo/article/details/130833884。这样写是没有检查newnode是否为空而直接使用,当内存空间不够时,malloc失败会返回空指针。指在malloc之后没有检查返回的指针是否为空。

jxbcv的博客 328
上一篇: vc 学习点滴之终结篇
下一篇: 如何调试程序的 Release 版本
Mobidogs
博客等级 码龄21年 186粉丝 264原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值