“混合建议规则”规则集

这些微软推荐的混合规则重点针对支持公共语言运行时的 C++ 项目中的最常见问题和最关键问题,其中包括潜在安全漏洞、应用程序崩溃以及其他重要的逻辑错误和设计错误。应在您为支持公共语言运行时的 C++ 项目创建的任何自定义规则集中包含此规则集。对于此规则集,应当使用 Visual Studio 专业版及更高版本进行配置。

规则

说明

C6001

正在使用未初始化的内存

C6011

正在取消对空指针的引用

C6029

使用未经检查的值

C6031

返回值被忽略:

C6053

调用中包含零终止

C6054

零终止缺失

C6059

串联错误

C6063

格式函数缺少字符串参数

C6064

格式函数缺少整数参数

C6066

格式函数缺少指针参数

C6067

格式函数缺少字符串指针参数

C6101

正在返回未初始化的内存

C6200

索引超出缓冲区最大容量

C6201

索引超出堆栈缓冲区最大容量

C6214

从 HRESULT 到 BOOL 的强制转换无效

C6215

从 BOOL 到 HRESULT 的强制转换无效

C6216

由编译器插入的从 BOOL 到 HRESULT 的强制转换无效

C6217

对 HRESULT 的 NOT 测试无效

C6220

HRESULT 与 1 的比较无效

C6226

HRESULT 到 -1 的赋值无效

C6230

HRESULT 用作 Boolean 无效

C6235

非零常量的逻辑或运算

C6236

非零常量的逻辑或运算

C6237

零使用逻辑和失去副作用

C6242

已强制执行局部回退

C6248

正在创建 空 DACL

C6250

未释放的地址说明符

C6255

不受保护的 Alloca 用法

C6258

请使用终止线程

C6259

按位或限制开关中存在死代码

C6260

使用字节算术

C6262

堆栈使用过多

C6263

在循环中使用 alloca

C6268

强制转换中缺少括号

C6269

已忽略取消引用指针

C6270

格式函数缺少浮点参数

C6271

格式函数有多余参数

C6272

格式函数有非浮点参数

C6273

格式函数有非整型参数

C6274

格式函数有非字符参数

C6276

字符串强制转换无效

C6277

CreateProcess 调用无效

C6278

数组新建与标量删除不匹配

C6279

数组新建与标量删除不匹配

C6280

内存分配与解除分配不匹配

C6281

按位关系优先顺序

C6282

赋值替换测试

C6283

基元数组新建与标量删除不匹配

C6284

格式函数的对象参数无效

C6285

常量的逻辑或运算

C6286

非零逻辑或运算丧失副作用

C6287

冗余测试

C6288

相互包括逻辑和为 false

C6289

基于逻辑或的互斥运算为 true

C6290

逻辑的-非按位智能-优先

C6291

逻辑非按位或优先

C6292

循环从最大值开始向上计数

C6293

循环从最小值开始向下计数

C6294

从未执行循环体

C6295

无限循环

C6296

循环只执行一次

C6297

移位结果转换为较大大小

C6299

位域到布尔值比较

C6302

格式函数的字符字符串参数无效

C6303

格式函数的宽字符字符串参数无效

C6305

大小和计数使用不匹配

C6306

变量参数函数调用错误

C6308

Realloc 泄漏

C6310

非法的异常筛选器常量

C6312

异常继续执行循环

C6314

按位或优先顺序

C6317

不是未完成

C6318

异常继续搜索

C6319

按逗号忽略

C6324

字符串复制而非字符串比较

C6328

潜在参数类型不匹配

C6331

VirtualFree 无效标志

C6332

VirtualFree 无效参数

C6333

VirtualFree 无效大小

C6335

泄漏进程句柄

C6381

关机信息缺失

C6383

元素计数字节计数缓冲区溢出

C6384

指针大小划分

C6385

读溢出

C6386

写溢出

C6387

参数值无效

C6388

参数值无效

C6500

无效特性属性

C6501

特性属性值冲突

C6503

引用不可为空

C6504

非指针为 空

C6505

Void 的 MustCheck

C6506

非指针或数组的缓冲区大小

C6507

在取消引用空的零不匹配

C6508

常量写访问

C6509

对前置条件使用了返回值

C6510

Null 终止于非指针

C6511

MustCheck 必须为 Yes 或 No

C6513

无缓冲区大小的元素大小

C6514

缓冲区大小超出数组大小

C6515

非指针缓冲区大小

C6516

特性无属性

C6517

不可读缓冲区的有效大小

C6518

不可写缓冲区的可写大小

C6519

无效的批注:“NeedsRelease”属性的值必须为 Yes 或 No

C6521

无效的字符串大小间接引用

C6522

无效大小字符串类型

C6523

无效的字符串大小参数

C6525

无效大小字符串不可访问位置

C6526

无效的字符串大小缓冲区类型

C6527

无效的批注: 无法对 void 类型的值使用 NeedsRelease 属性

C6530

无法识别的格式字符串样式

C6540

对此函数使用特性批注将使其现有的所有 __declspec 批注无效

C6551

大小规范无效: 表达式不可分析

C6552

Deref= 或 Notref= 无效: 表达式不可分析

C6701

该值不是有效的 Yes/No/Maybe 值:

C6702

该值不是字符串值

C6703

该值不是数字:

C6704

意外的批注表达式错误:

C6705

参数所需数目的注释不匹配参数的实际数目的注释

C6706

批注的意外批注错误:

C6995

未能保存 XML 日志文件

C26100

争用条件。

C26101

未能正确使用联锁操作

C26110

调用方未能持有锁

C26111

调用方未能解除锁

C26112

调用方无法持有任何锁

C26115

未能解除锁

C26116

未能获取或持有锁

C26117

解除未持有的锁

C26140

并发 SAL 注释错误

C28020

表达式对于此调用不适用

C28021

所批注的参数必须是指针

C28022

此函数的函数类与用于定义它的 typedef 的函数类不匹配。

C28023

分配或传递的函数应具有至少一类的_Function_class_批注。

C28024

要分配的函数指针是用函数类批注的,它未包含在函数类表中。

C28039

实参的类型应与该类型完全匹配

C28112

通过 Interlocked 函数访问的变量必须始终通过 Interlocked 函数来访问

C28113

通过互锁函数访问本地变量

C28125

该函数必须从 try/except 块中调用

C28137

该变量参数应改为(文本)常量

C28138

该常量参数应改为变量

C28159

请考虑改用其他函数

C28160

错误批注

C28163

该函数不应从 try/except 块中调用

C28164

正在将参数传递给一个函数,该函数需要一个指向某个对象的指针(而非指向某个指针的指针)

C28182

取消对 NULL 指针的引用。指针包含与其他指针的空值。

C28183

该参数可能是一个值,并且是在指针中找到的值的副本。

C28193

该变量保留了一个必须检查的值

C28196

未满足要求。(该表达式未计算为 true。)

C28202

对非静态成员进行了非法引用

C28203

对类成员的不明确引用。

C28205

在非法上下文中使用了 _Success_ 或 _On_failure_

C28206

左操作数指向 struct,使用'->'。

C28207

左操作数是 struct,使用“.”。

C28209

符号的声明具有冲突的声明

C28210

_On_failure_ 上下文的批注不得位于显式 pre 上下文中

C28211

SAL_context 需要静态上下文名称

C28212

批注需要指针表达式

C28213

_Use_decl_annotations_ 批注必须用于引用(无需修改)以前的声明。

C28214

特性参数名称必须为 p1...p9

C28215

typefix 无法应用于已具有 typefix 的参数

C28216

checkReturn批注仅适用于特定函数参数的后置条件。

C28217

对于函数,批注的参数数量与在文件中找到的数量不匹配

C28218

对于函数参数,批注的参数与在文件中找到的参数不匹配

C28219

批注中的参数应为枚举成员

C28220

批注中的参数应为整数表达式

C28221

批注中的参数应为字符串表达式

C28222

批注需要 __yes、__no 或 __maybe

C28223

对于批注,参数未找到预期的标记/标识符

C28224

批注需要参数

C28225

在批注中找到的所需参数的数量不正确

C28226

批注也不能为 PrimOp (在当前声明中)

C28227

批注也不能为 PrimOp (参见上一个声明)

C28228

批注参数:不能在批注中使用类型

C28229

批注不支持参数

C28230

参数类型没有成员

C28231

批注仅对数组有效

C28232

pre、post 或 deref 不适用于任何批注。

C28233

pre、post 或 deref 适用于块。

C28234

_at_ 表达式不适用于当前函数。

C28235

函数不能作为批注单独存在

C28236

不能在表达式中使用该批注

C28237

不再支持参数上的批注

C28238

参数上的批注有多个 value、stringValue 和 longValue。使用 paramn=xxx

C28239

参数上的批注同时具有 value、stringValue 或 longValue 之一和 paramn=xxx。仅使用 paramn=xxx

C28240

参数上的批注有 param2,但没有 param1

C28241

无法识别参数上函数的批注

C28243

参数上函数的批注需要的取消引用次数多于已批注的实际类型所允许的次数

C28244

函数的批注包含无法分析的参数/外部批注

C28245

函数的批注在非成员函数上批注“this”

C28246

函数的参数不匹配参数的类型批注

C28250

函数的注解不一致:上一个实例有错误

C28251

函数的注解不一致:此实例有错误

C28252

函数的批注不一致:参数在此实例上有另一个批注

C28253

函数的批注不一致:参数在此实例上有另一个批注

C28254

批注中不支持 dynamic_cast<>()。

C28262

在函数中找到了批注的语法错误(对于批注):

C28263

内部批注的条件批注中发现了语法错误

C28264

结果列表值必须是常量。

C28267

在函数中找到了批注的语法错误(对于批注):

C28272

检查时针对函数参数的批注与函数声明不一致

C28273

对于函数,线索与函数声明不一致

C28275

_Macro_value_ 的参数为 null

C28279

对于符号,已找到“begin”,但没有匹配的“end”

C28280

对于符号,发现了没有与之匹配的“begin”的“end”

C28282

格式字符串必须位于前置条件中:

C28285

对于函数,参数中有语法错误

C28286

对于函数,结尾附近有语法错误

C28287

对于函数, 批注中存在语法错误(无法识别的参数名)

C28288

对于函数,_At_() 批注中存在语法错误(无效的参数名)

C28289

对于函数: ReadableTo 或 WritableTo 没有用作参数的限制规范。

C28290

函数的批注包含的外部对象多于参数的实际数量

C28291

deref 级别 0 处的 post null/notnull 对于函数无意义。

C28300

运算符的不兼容类型的表达式操作数

C28301

函数的第一个声明没有批注

C28302

在批注上发现额外的 _Deref_ 运算符

C28303

在批注上发现不明确的 _Deref_ 运算符

C28304

发现对令牌应用了放置位置不正确的 _Notref_ 运算符

C28305

分析 token 时发现了错误。

C28306

对参数的批注已过时

C28307

对参数的批注已过时

C28350

该注释描述了在特定条件下不适用的情况.

C28351

批注描述了一种无法使用动态值(变量)的情况。

CA1001

那自己可支配领域类型应该是一次性的

CA1009

正确声明事件处理程序

CA1016

用AssemblyVersionAttribute标记组件

CA1033

接口方法能由子类可调用

CA1049

拥有本机资源的类型应该是一次性的

CA1060

移动P/Invokes 到 NativeMethods类

CA1061

不要隐藏基类方法

CA1063

正确实现IDisposable

CA1065

不提高在意外的位置异常

CA1301

避免重复加速器

CA1400

P / Invoke入口点应该存在

CA1401

P/Invokes应该是不可见

CA1403

自动布局类型不应该是COM可见

CA1404

P / Invoke后立即调用GetLastError

CA1405

COM可见类型的基类型应该是COM可见

CA1410

COM注册方法应该匹配

CA1415

正确声明P/Invokes

CA1821

移除空的终结

CA1900

值类型字段应该是便携的

CA1901

P/Invoke 声明应为可移植声明

CA2002

不要锁定具有弱标识的对象

CA2100

检查SQL查询的安全漏洞

CA2101

指定封送处理的P / Invoke字符串参数

CA2108

审查的声明性安全上的值类型

CA2111

指针应该是不可见

CA2112

有保证的类型不应公开栏

CA2114

方法的安全性应该是类型的一个超集

CA2116

APTCA方法应该只调用APTCA方法

CA2117

APTCA类型应该只延长APTCA基本类型

CA2122

不要使用链接请求间接公开方法

CA2123

重写的链接请求应与基相同

CA2124

裹在外层的try脆弱的finally子句

CA2126

类型链接请求需要继承要求

CA2131

安全关键类型可能不参与类型等价

CA2132

默认构造函数必须至少与基类型默认构造函数一样关键

CA2133

委托必须绑定到具有一致透明度的方法

CA2134

重写基方法时,方法必须保持一致的透明度

CA2137

透明方法必须只包含可验证的IL

CA2138

透明方法不得调用与SuppressUnmanagedCodeSecurity属性的方法

CA2140

透明代码不得引用安全关键项

CA2141

透明方法不得满足LinkDemands

CA2146

类型必须至少与其基类型和接口一样关键

CA2147

透明方法不得使用安全断言

CA2149

透明方法不能调用本地代码

CA2200

重新抛出保存堆栈的详细信息

CA2202

不要多次释放对象

CA2207

以内联方式初始化值类型的静态字段

CA2212

不要使用 WebMethod 标记服务组件

CA2213

应释放可释放的字段

CA2214

不要调用构造函数重写的方法

CA2216

可释放类型应声明终结器

CA2220

终结器应调用基类的终结器

CA2229

实现序列化构造函数

CA2231

重写 ValueType.Equals 时应重载相等运算符

CA2232

使用 STAThread 标记 Windows 窗体的入口点

CA2235

标记所有不可序列化的字段

CA2236

对 ISerializable 的类调用基类方法

CA2237

以 SerializableAttribute 标记 ISerializable 类型

CA2238

正确实现序列化方法

CA2240

正确实现 ISerializable

CA2241

为格式化方法提供正确的参数

CA2242

正确测试NaN