“混合建议规则”规则集
这些微软推荐的混合规则重点针对支持公共语言运行时的 C++ 项目中的最常见问题和最关键问题,其中包括潜在安全漏洞、应用程序崩溃以及其他重要的逻辑错误和设计错误。应在您为支持公共语言运行时的 C++ 项目创建的任何自定义规则集中包含此规则集。对于此规则集,应当使用 Visual Studio 专业版及更高版本进行配置。
规则 |
说明 |
---|---|
正在使用未初始化的内存 |
|
正在取消对空指针的引用 |
|
使用未经检查的值 |
|
返回值被忽略: |
|
调用中包含零终止 |
|
零终止缺失 |
|
串联错误 |
|
格式函数缺少字符串参数 |
|
格式函数缺少整数参数 |
|
格式函数缺少指针参数 |
|
格式函数缺少字符串指针参数 |
|
正在返回未初始化的内存 |
|
索引超出缓冲区最大容量 |
|
索引超出堆栈缓冲区最大容量 |
|
从 HRESULT 到 BOOL 的强制转换无效 |
|
从 BOOL 到 HRESULT 的强制转换无效 |
|
由编译器插入的从 BOOL 到 HRESULT 的强制转换无效 |
|
对 HRESULT 的 NOT 测试无效 |
|
HRESULT 与 1 的比较无效 |
|
HRESULT 到 -1 的赋值无效 |
|
HRESULT 用作 Boolean 无效 |
|
非零常量的逻辑或运算 |
|
非零常量的逻辑或运算 |
|
零使用逻辑和失去副作用 |
|
已强制执行局部回退 |
|
正在创建 空 DACL |
|
未释放的地址说明符 |
|
不受保护的 Alloca 用法 |
|
请使用终止线程 |
|
按位或限制开关中存在死代码 |
|
使用字节算术 |
|
堆栈使用过多 |
|
在循环中使用 alloca |
|
强制转换中缺少括号 |
|
已忽略取消引用指针 |
|
格式函数缺少浮点参数 |
|
格式函数有多余参数 |
|
格式函数有非浮点参数 |
|
格式函数有非整型参数 |
|
格式函数有非字符参数 |
|
字符串强制转换无效 |
|
CreateProcess 调用无效 |
|
数组新建与标量删除不匹配 |
|
数组新建与标量删除不匹配 |
|
内存分配与解除分配不匹配 |
|
按位关系优先顺序 |
|
赋值替换测试 |
|
基元数组新建与标量删除不匹配 |
|
格式函数的对象参数无效 |
|
常量的逻辑或运算 |
|
非零逻辑或运算丧失副作用 |
|
冗余测试 |
|
相互包括逻辑和为 false |
|
基于逻辑或的互斥运算为 true |
|
逻辑的-非按位智能-优先 |
|
逻辑非按位或优先 |
|
循环从最大值开始向上计数 |
|
循环从最小值开始向下计数 |
|
从未执行循环体 |
|
无限循环 |
|
循环只执行一次 |
|
移位结果转换为较大大小 |
|
位域到布尔值比较 |
|
格式函数的字符字符串参数无效 |
|
格式函数的宽字符字符串参数无效 |
|
大小和计数使用不匹配 |
|
变量参数函数调用错误 |
|
Realloc 泄漏 |
|
非法的异常筛选器常量 |
|
异常继续执行循环 |
|
按位或优先顺序 |
|
不是未完成 |
|
异常继续搜索 |
|
按逗号忽略 |
|
字符串复制而非字符串比较 |
|
潜在参数类型不匹配 |
|
VirtualFree 无效标志 |
|
VirtualFree 无效参数 |
|
VirtualFree 无效大小 |
|
泄漏进程句柄 |
|
关机信息缺失 |
|
元素计数字节计数缓冲区溢出 |
|
指针大小划分 |
|
读溢出 |
|
写溢出 |
|
参数值无效 |
|
参数值无效 |
|
无效特性属性 |
|
特性属性值冲突 |
|
引用不可为空 |
|
非指针为 空 |
|
Void 的 MustCheck |
|
非指针或数组的缓冲区大小 |
|
在取消引用空的零不匹配 |
|
常量写访问 |
|
对前置条件使用了返回值 |
|
Null 终止于非指针 |
|
MustCheck 必须为 Yes 或 No |
|
无缓冲区大小的元素大小 |
|
缓冲区大小超出数组大小 |
|
非指针缓冲区大小 |
|
特性无属性 |
|
不可读缓冲区的有效大小 |
|
不可写缓冲区的可写大小 |
|
无效的批注:“NeedsRelease”属性的值必须为 Yes 或 No |
|
无效的字符串大小间接引用 |
|
无效大小字符串类型 |
|
无效的字符串大小参数 |
|
无效大小字符串不可访问位置 |
|
无效的字符串大小缓冲区类型 |
|
无效的批注: 无法对 void 类型的值使用 NeedsRelease 属性 |
|
无法识别的格式字符串样式 |
|
对此函数使用特性批注将使其现有的所有 __declspec 批注无效 |
|
大小规范无效: 表达式不可分析 |
|
Deref= 或 Notref= 无效: 表达式不可分析 |
|
该值不是有效的 Yes/No/Maybe 值: |
|
该值不是字符串值 |
|
该值不是数字: |
|
意外的批注表达式错误: |
|
参数所需数目的注释不匹配参数的实际数目的注释 |
|
批注的意外批注错误: |
|
未能保存 XML 日志文件 |
|
争用条件。 |
|
未能正确使用联锁操作 |
|
调用方未能持有锁 |
|
调用方未能解除锁 |
|
调用方无法持有任何锁 |
|
未能解除锁 |
|
未能获取或持有锁 |
|
解除未持有的锁 |
|
并发 SAL 注释错误 |
|
表达式对于此调用不适用 |
|
所批注的参数必须是指针 |
|
此函数的函数类与用于定义它的 typedef 的函数类不匹配。 |
|
分配或传递的函数应具有至少一类的_Function_class_批注。 |
|
要分配的函数指针是用函数类批注的,它未包含在函数类表中。 |
|
实参的类型应与该类型完全匹配 |
|
通过 Interlocked 函数访问的变量必须始终通过 Interlocked 函数来访问 |
|
通过互锁函数访问本地变量 |
|
该函数必须从 try/except 块中调用 |
|
该变量参数应改为(文本)常量 |
|
该常量参数应改为变量 |
|
请考虑改用其他函数 |
|
错误批注 |
|
该函数不应从 try/except 块中调用 |
|
正在将参数传递给一个函数,该函数需要一个指向某个对象的指针(而非指向某个指针的指针) |
|
取消对 NULL 指针的引用。指针包含与其他指针的空值。 |
|
该参数可能是一个值,并且是在指针中找到的值的副本。 |
|
该变量保留了一个必须检查的值 |
|
未满足要求。(该表达式未计算为 true。) |
|
对非静态成员进行了非法引用 |
|
对类成员的不明确引用。 |
|
在非法上下文中使用了 _Success_ 或 _On_failure_ |
|
左操作数指向 struct,使用'->'。 |
|
左操作数是 struct,使用“.”。 |
|
符号的声明具有冲突的声明 |
|
_On_failure_ 上下文的批注不得位于显式 pre 上下文中 |
|
SAL_context 需要静态上下文名称 |
|
批注需要指针表达式 |
|
_Use_decl_annotations_ 批注必须用于引用(无需修改)以前的声明。 |
|
特性参数名称必须为 p1...p9 |
|
typefix 无法应用于已具有 typefix 的参数 |
|
checkReturn批注仅适用于特定函数参数的后置条件。 |
|
对于函数,批注的参数数量与在文件中找到的数量不匹配 |
|
对于函数参数,批注的参数与在文件中找到的参数不匹配 |
|
批注中的参数应为枚举成员 |
|
批注中的参数应为整数表达式 |
|
批注中的参数应为字符串表达式 |
|
批注需要 __yes、__no 或 __maybe |
|
对于批注,参数未找到预期的标记/标识符 |
|
批注需要参数 |
|
在批注中找到的所需参数的数量不正确 |
|
批注也不能为 PrimOp (在当前声明中) |
|
批注也不能为 PrimOp (参见上一个声明) |
|
批注参数:不能在批注中使用类型 |
|
批注不支持参数 |
|
参数类型没有成员 |
|
批注仅对数组有效 |
|
pre、post 或 deref 不适用于任何批注。 |
|
pre、post 或 deref 适用于块。 |
|
_at_ 表达式不适用于当前函数。 |
|
函数不能作为批注单独存在 |
|
不能在表达式中使用该批注 |
|
不再支持参数上的批注 |
|
参数上的批注有多个 value、stringValue 和 longValue。使用 paramn=xxx |
|
参数上的批注同时具有 value、stringValue 或 longValue 之一和 paramn=xxx。仅使用 paramn=xxx |
|
参数上的批注有 param2,但没有 param1 |
|
无法识别参数上函数的批注 |
|
参数上函数的批注需要的取消引用次数多于已批注的实际类型所允许的次数 |
|
函数的批注包含无法分析的参数/外部批注 |
|
函数的批注在非成员函数上批注“this” |
|
函数的参数不匹配参数的类型批注 |
|
函数的注解不一致:上一个实例有错误 |
|
函数的注解不一致:此实例有错误 |
|
函数的批注不一致:参数在此实例上有另一个批注 |
|
函数的批注不一致:参数在此实例上有另一个批注 |
|
批注中不支持 dynamic_cast<>()。 |
|
在函数中找到了批注的语法错误(对于批注): |
|
内部批注的条件批注中发现了语法错误 |
|
结果列表值必须是常量。 |
|
在函数中找到了批注的语法错误(对于批注): |
|
检查时针对函数参数的批注与函数声明不一致 |
|
对于函数,线索与函数声明不一致 |
|
_Macro_value_ 的参数为 null |
|
对于符号,已找到“begin”,但没有匹配的“end” |
|
对于符号,发现了没有与之匹配的“begin”的“end” |
|
格式字符串必须位于前置条件中: |
|
对于函数,参数中有语法错误 |
|
对于函数,结尾附近有语法错误 |
|
对于函数, 批注中存在语法错误(无法识别的参数名) |
|
对于函数,_At_() 批注中存在语法错误(无效的参数名) |
|
对于函数: ReadableTo 或 WritableTo 没有用作参数的限制规范。 |
|
函数的批注包含的外部对象多于参数的实际数量 |
|
deref 级别 0 处的 post null/notnull 对于函数无意义。 |
|
运算符的不兼容类型的表达式操作数 |
|
函数的第一个声明没有批注 |
|
在批注上发现额外的 _Deref_ 运算符 |
|
在批注上发现不明确的 _Deref_ 运算符 |
|
发现对令牌应用了放置位置不正确的 _Notref_ 运算符 |
|
分析 token 时发现了错误。 |
|
对参数的批注已过时 |
|
对参数的批注已过时 |
|
该注释描述了在特定条件下不适用的情况. |
|
批注描述了一种无法使用动态值(变量)的情况。 |
|
那自己可支配领域类型应该是一次性的 |
|
正确声明事件处理程序 |
|
用AssemblyVersionAttribute标记组件 |
|
接口方法能由子类可调用 |
|
拥有本机资源的类型应该是一次性的 |
|
移动P/Invokes 到 NativeMethods类 |
|
不要隐藏基类方法 |
|
正确实现IDisposable |
|
不提高在意外的位置异常 |
|
避免重复加速器 |
|
P / Invoke入口点应该存在 |
|
P/Invokes应该是不可见 |
|
自动布局类型不应该是COM可见 |
|
P / Invoke后立即调用GetLastError |
|
COM可见类型的基类型应该是COM可见 |
|
COM注册方法应该匹配 |
|
正确声明P/Invokes |
|
移除空的终结 |
|
值类型字段应该是便携的 |
|
P/Invoke 声明应为可移植声明 |
|
不要锁定具有弱标识的对象 |
|
检查SQL查询的安全漏洞 |
|
指定封送处理的P / Invoke字符串参数 |
|
审查的声明性安全上的值类型 |
|
指针应该是不可见 |
|
有保证的类型不应公开栏 |
|
方法的安全性应该是类型的一个超集 |
|
APTCA方法应该只调用APTCA方法 |
|
APTCA类型应该只延长APTCA基本类型 |
|
不要使用链接请求间接公开方法 |
|
重写的链接请求应与基相同 |
|
裹在外层的try脆弱的finally子句 |
|
类型链接请求需要继承要求 |
|
安全关键类型可能不参与类型等价 |
|
默认构造函数必须至少与基类型默认构造函数一样关键 |
|
委托必须绑定到具有一致透明度的方法 |
|
重写基方法时,方法必须保持一致的透明度 |
|
透明方法必须只包含可验证的IL |
|
透明方法不得调用与SuppressUnmanagedCodeSecurity属性的方法 |
|
透明代码不得引用安全关键项 |
|
透明方法不得满足LinkDemands |
|
类型必须至少与其基类型和接口一样关键 |
|
透明方法不得使用安全断言 |
|
透明方法不能调用本地代码 |
|
重新抛出保存堆栈的详细信息 |
|
不要多次释放对象 |
|
以内联方式初始化值类型的静态字段 |
|
不要使用 WebMethod 标记服务组件 |
|
应释放可释放的字段 |
|
不要调用构造函数重写的方法 |
|
可释放类型应声明终结器 |
|
终结器应调用基类的终结器 |
|
实现序列化构造函数 |
|
重写 ValueType.Equals 时应重载相等运算符 |
|
使用 STAThread 标记 Windows 窗体的入口点 |
|
标记所有不可序列化的字段 |
|
对 ISerializable 的类调用基类方法 |
|
以 SerializableAttribute 标记 ISerializable 类型 |
|
正确实现序列化方法 |
|
正确实现 ISerializable |
|
为格式化方法提供正确的参数 |
|
正确测试NaN |