托管代码的“扩展的更正规则”规则集
“Microsoft 扩展的更正规则”规则集可使代码分析尽可能多地报告逻辑错误和 framework 使用错误。着重强调了某些特定的方案,如 COM 互操作性和移动应用程序。如果这些方案中的某一个适用于您的项目,或若要查找项目中的其他问题,应考虑加入此规则集。
“Microsoft 扩展的更正规则”规则集包括“Microsoft 基本更正规则”规则集中的规则。“基本更正规则”包括“Microsoft 最少量建议规则”规则集中的规则。有关更多信息,请参见托管代码的“基本更正规则”规则集和托管代码的“托管建议规则”规则集。
下表介绍了“Microsoft 扩展的更正规则”规则集中的所有规则。
规则 |
说明 |
---|---|
那自己可支配领域类型应该是一次性的 |
|
正确声明事件处理程序 |
|
用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 |
|
枚举应该具有0值 |
|
重载加法方法和减法方法时重载相等运算符 |
|
不要将文本作为本地化参数传递 |
|
将字符串规范化为大写 |
|
不要忽略方法结果 |
|
正确调用 GC.SuppressFinalize |
|
属性不应返回数组 |
|
测试使用字符串长度的空字符串 |
|
仅使用目标框架中的 API |
|
移除对 GC.KeepAlive 的调用 |
|
使用 SafeHandle 封装本机资源 |
|
在常规处理程序中捕捉非 CLSCompliant 异常 |
|
不要声明只读可变引用类型 |
|
数组字段不应为只读 |
|
保护断言 |
|
使用本机资源时调用 GC.KeepAlive |
|
密封满足私有接口的方法 |
|
保护序列化构造函数 |
|
静态构造函数应为私有 |
|
安全关键常量应是透明的 |
|
Win32 API的使用管理等同 |
|
Dispose 方法应调用基类的 Dispose |
|
终结应受到保护 |
|
不要降低继承成员的可见性 |
|
成员应该超过返回类型不同 |
|
重写equals超载运算符等号 |
|
运算符应有对称重载 |
|
集合属性应该是只读 |
|
提供反序列化方法可选字段 |
|
实施标准异常构造 |
|
URI参数不应为字符串 |
|
URI返回值不应是字符串 |
|
URI属性不应是字符串 |
|
字符串的URI重载调用的System.Uri重载 |
|
避免在 COM 可见接口中进行重载 |
|
避免对 Visual Basic 6 客户端使用 Int64 参数 |
|
避免在 COM 可见类型中使用静态成员 |
|
请不要使用 AutoDual ClassInterfaceType |
|
Com 可见类型应该是可创建的 |
|
COM 注册方法应该是不可见的 |
|
将 ComSource 接口标记为 IDispatch |
|
避免在 COM 可见值类型中使用非公共字段 |
|
用 MarshalAs 标记布尔型 P/Invoke 参数 |
|
不要使用 Idle 进程优先级 |
|
不要使用阻止电源状态更改的计时器 |
|
用 NeutralResourcesLanguageAttribute 标记程序集 |
|
避免调用有问题的方法 |
|
不要将纤程视为线程 |
|
级别 2 程序集不应包含 LinkDemand |
|
成员不应有相互冲突的透明度注释 |
|
透明方法不能使用 HandleProcessCorruptingExceptions 特性 |
|
不应使用 LinkDemand 保护透明代码 |
|
透明方法不应使用安全要求 |
|
透明代码不应从字节数组加载程序集 |
|
不应使用 SuppressUnmanagedCodeSecurityAttribute 修饰透明方法 |
|
文字应该正确的拼写 |
|
非常数区域应该是不可见 |
|
不要使用FlagsAttribute标记枚举 |
|
重写 Equals 时重写 GetHashCode |
|
在异常子句中不引发异常 |
|
运算符重载具有命名的备用项 |
|
不要发行未发布的资源格式 |
|
使用PARAMS的可变参数 |
|
运算不应溢出 |
|
传递System.Uri对象,而不是字符串 |
|
应正确分析特性字符串文本 |