Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CA1062:验证公共方法的参数

CA1062:验证公共方法的参数

作者头像
呆呆
发布于 2022-01-10 01:36:19
发布于 2022-01-10 01:36:19
8730
举报
文章被收录于专栏:centosDaicentosDai

规则 ID

CA1062

类别

设计

修复是中断修复还是非中断修复

非中断

原因

外部可见方法取消引用其中一个引用参数,而不验证该参数是否 null(Visual Basic 中 Nothing)。

可以将此规则配置为从分析中排除某些类型和参数。 还可以指示 null 检查验证方法。

规则说明

对于传递给外部可见方法的所有引用参数,都应检查其是否为 null。 如果需要,则在参数为 null 时引发 ArgumentNullException。

如果某个方法由于被声明为公共或受保护而可以从未知程序集进行调用,则应验证该方法的所有参数。 如果该方法设计为仅由已知程序集调用,请将方法标记为 internal并将 InternalsVisibleToAttribute 特性应用于包含该方法的程序集。

如何解决冲突

若要修复与此规则的冲突,请验证每个引用参数是否为 null。

何时禁止显示警告

如果确定取消引用的参数已由函数中的其他方法调用进行验证,则可以禁止显示此规则发出的警告。

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

排除特定符号

排除特定类型及其派生类型

排除扩展方法“this”参数

Null 检查验证方法

可以仅为此规则、为所有规则或为此类别(设计)中的所有规则配置这些选项。 有关详细信息,请参阅代码质量规则配置选项。

排除特定符号

可以从分析中排除特定符号,如类型和方法。 例如,若要指定规则不应针对名为 MyType 的类型中的任何代码运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

选项值中允许的符号名称格式(用 | 分隔):

仅符号名称(包括具有相应名称的所有符号,不考虑包含的类型或命名空间)。

完全限定的名称,使用符号的文档 ID 格式。 每个符号名称都需要带有一个符号类型前缀,例如表示方法的 M:、表示类型的 T:,以及表示命名空间的 N:。

.ctor 表示构造函数,.cctor 表示静态构造函数。

示例:

选项值

总结

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

匹配名为 MyType 的所有符号。

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2

匹配名为 MyType1 或 MyType2 的所有符号。

dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType)

匹配带有指定的完全限定签名的特定方法 MyMethod。

dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType)

匹配带有各自的完全限定签名的特定方法 MyMethod1 和 MyMethod2。

排除特定类型及其派生类型

可以从分析中排除特定类型及其派生类型。 例如,若要指定规则不应针对名为 MyType 的类型及其派生类型中的任何代码运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

选项值中允许的符号名称格式(用 | 分隔):

仅类型名称(包括具有相应名称的所有类型,不考虑包含的类型或命名空间)。

完全限定的名称,使用符号的文档 ID 格式,前缀为 T:(可选)。

示例:

选项值

总结

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

匹配名为 MyType 的所有类型及其所有派生类型。

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2

匹配名为 MyType1 或 MyType2 的所有类型及其所有派生类型。

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType

匹配带有给定的完全限定名称的特定类型 MyType 及其所有派生类型。

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2

匹配带有各自的完全限定名称的特定类型 MyType1 和 MyType2 及其所有派生类型。

排除扩展方法“this”参数

默认情况下,此规则分析并标记扩展方法的 this 参数。 可以通过将以下键值对添加到项目中的 editorconfig 文件,排除扩展方法的 this 参数的分析:

dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true

Null 检查验证方法

如果代码在引用的库或项目中调用了特殊的 null 检查验证方法,则此规则可能导致误报。 可以通过指定 null 检查验证方法的名称或签名来避免这种误报。 此分析假定在调用后传递给这些方法的参数为非 null。 例如,若要将名为 Validate 的所有方法标记为 null 检查验证方法,请将以下键值对添加到项目中的 editorconfig 文件:

dotnet_code_quality.CA1062.null_check_validation_methods = Validate

选项值中允许的方法名称格式(用 | 分隔):

仅方法名称(包括具有相应名称的所有方法,不考虑包含的类型或命名空间)。

完全限定的名称,使用符号的文档 ID 格式,前缀为 M:(可选)。

示例:

选项值

总结

dotnet_code_quality.CA1062.null_check_validation_methods = Validate

匹配编译中所有名为 Validate 的方法

dotnet_code_quality.CA1062.null_check_validation_methods = Validate1|Validate2

匹配编译中所有名为 Validate1 或 Validate2 的方法

dotnet_code_quality.CA1062.null_check_validation_methods = NS.MyType.Validate(ParamType)

将特定方法 Validate 与给定的完全限定签名相匹配

dotnet_code_quality.CA1062.null_check_validation_methods = NS1.MyType1.Validate1(ParamType)|NS2.MyType2.Validate2(ParamType)

将特定方法 Validate1 和 Validate2 与相应的完全限定签名相匹配

示例 1

下面的示例演示了违反规则的方法和符合规则的方法。

using System;

namespace DesignLibrary

{

public class Test

{

// This method violates the rule.

public void DoNotValidate(string input)

{

if (input.Length != 0)

{

Console.WriteLine(input);

}

}

// This method satisfies the rule.

public void Validate(string input)

{

if (input == null)

{

throw new ArgumentNullException(nameof(input));

}

if (input.Length != 0)

{

Console.WriteLine(input);

}

}

}

}

Imports System

Namespace DesignLibrary

Public Class Test

' This method violates the rule.

Sub DoNotValidate(ByVal input As String)

If input.Length <> 0 Then

Console.WriteLine(input)

End If

End Sub

' This method satisfies the rule.

Sub Validate(ByVal input As String)

If input Is Nothing Then

Throw New ArgumentNullException(NameOf(input))

End If

If input.Length <> 0 Then

Console.WriteLine(input)

End If

End Sub

End Class

End Namespace

示例 2

填充为引用对象的字段或属性的复制构造函数也可能与 CA1062 规则发生冲突。 发生冲突的原因是,传递到复制构造函数的所复制对象可能为 null(在 Visual Basic 中为 Nothing)。 若要解决冲突,请使用 static(在 Visual Basic 中为 Shared)方法来检查复制的对象是否不为 null。

在下面的 Person 类示例中,传递给 Person 复制构造函数的 other 对象可能为 null。

public class Person

{

public string Name { get; private set; }

public int Age { get; private set; }

public Person(string name, int age)

{

Name = name;

Age = age;

}

// Copy constructor CA1062 fires because other is dereferenced

// without being checked for null

public Person(Person other)

: this(other.Name, other.Age)

{

}

}

示例 3

在下面经修订的 Person 示例中,系统首先会在 PassThroughNonNull 方法中检查传递给复制构造函数的 other 对象是否为 null。

public class Person

{

public string Name { get; private set; }

public int Age { get; private set; }

public Person(string name, int age)

{

Name = name;

Age = age;

}

// Copy constructor

public Person(Person other)

: this(PassThroughNonNull(other).Name, other.Age)

{

}

// Null check method

private static Person PassThroughNonNull(Person person)

{

if (person == null)

throw new ArgumentNullException(nameof(person));

return person;

}

}

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CA1508:避免死条件代码
方法具有在运行时计算结果始终为 true 或 false 的条件代码。 这会导致条件的 false 分支中出现死代码。
呆呆
2022/02/18
5940
CA2327:不要使用不安全的 JsonSerializerSettings
如果 Newtonsoft.Json.JsonSerializerSettings 实例的以下两个条件均为 true,则会触发此规则:
呆呆
2022/02/20
5720
CA2329:不要使用不安全的配置反序列化 JsonSerializer
如果传递到反序列化方法或初始化为字段或属性的 Newtonsoft.Json.JsonSerializer 实例满足以下两个条件,则会触发此规则:
呆呆
2022/02/20
8400
CA3002:查看 XSS 漏洞的代码
在处理来自 Web 请求的不受信任的输入时,请注意防范跨站脚本 (XSS) 攻击。 XSS 攻击会将不受信任的输入注入原始 HTML 输出,使攻击者可以执行恶意脚本或恶意修改网页中的内容。 一个典型的技术是将包含恶意代码的 <script> 元素放入输入中。 有关详细信息,请参阅 OWASP 的 XSS。
呆呆
2022/02/20
7430
CA3004:查看信息泄露漏洞的代码
泄漏异常信息可让攻击者深入了解应用程序的内部机制,从而帮助攻击者找到其他漏洞并利用这些漏洞。
呆呆
2022/02/20
7060
CA3007:查看公开重定向漏洞的代码
处理不受信任的输入时,请注意防范开放重定向漏洞。 攻击者可以利用开放重定向漏洞,使用你的网站提供合法 URL 的外观,但将毫不知情的访客重定向到钓鱼网页或其他恶意网页。
呆呆
2022/02/20
9790
CA2312:确保在反序列化之前设置 NetDataContractSerializer.Binder
调用或引用了 System.Runtime.Serialization.NetDataContractSerializer 反序列化方法,但 Binder 属性可能为 NULL。
用户4268038
2022/02/26
5600
CA3003:查看文件路径注入漏洞的代码
在处理来自 Web 请求的不受信任的输入时,请谨慎使用用户控制的输入指定文件路径。 攻击者可能能够读取非预期文件,从而导致敏感数据出现信息泄漏。 或者,攻击者可能能够写入非预期文件,从而导致在未经授权的情况下修改敏感数据,或者降低服务器的安全性。 常见的攻击者技术是使用路径遍历访问预期目录之外的文件。
呆呆
2022/02/20
1.2K0
CA2321:请勿使用 SimpleTypeResolver 对 JavaScriptSerializer 进行反序列化
使用 System.Web.Script.Serialization.SimpleTypeResolver 初始化后,调用或引用了 System.Web.Script.Serialization.JavaScriptSerializer 反序列化方法。
用户4268038
2022/02/20
1.4K0
CA1068:CancellationToken 参数必须最后出现
执行长时间运行操作或异步操作并可取消的方法,通常采用取消令牌参数。 每个取消令牌都有一个 CancellationTokenSource,以创建令牌并将其用于可取消的计算。 通常的做法是使用一长的方法调用链,将取消令牌从调用方传递到被调用方。 因此,参与可取消计算的大量方法最终都具有取消令牌参数。 但是,取消令牌本身通常与大多数这些方法的核心功能无关。 将此类参数作为列表中的最后一个参数是一种很好的 API 设计实践。
用户4268038
2022/01/11
7290
CA2311:在未先设置 NetDataContractSerializer.Binder 的情况下,请不要反序列化
在未设置 Binder 属性的情况下调用或引用了 System.Runtime.Serialization.NetDataContractSerializer 反序列化方法。
用户4268038
2022/02/20
1.5K0
CA3001:查看 SQL 注入漏洞的代码
使用不受信任的输入和 SQL 命令时,请注意防范 SQL 注入攻击。 SQL 注入攻击可以执行恶意的 SQL 命令,从而降低应用程序的安全性和完整性。 典型的技术包括使用单引号或撇号分隔文本字符串,在注释中使用两个短划线,以及在语句末尾使用分号。 有关详细信息,请参阅 SQL Injection。
呆呆
2022/02/20
7770
CA2000:丢失范围之前释放对象
创建了 IDisposable 类型的本地对象,但该对象不会被释放,除非对对象的所有引用都超出范围。
呆呆
2022/02/26
1K0
CA2302:在调用 BinaryFormatter.Deserialize 之前,确保设置 BinaryFormatter.Binder
调用或引用了 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 反序列化方法,但 Binder 属性可能为 NULL。
用户4268038
2022/02/26
1.1K0
CA2330:在反序列化时确保 JsonSerializer 具有安全配置
如果传递到反序列化方法或初始化为字段或属性的 Newtonsoft.Json.JsonSerializer 实例满足以下两个条件,则会触发此规则:
呆呆
2022/02/20
6310
CA2328:确保 JsonSerializerSettings 是安全的
如果 Newtonsoft.Json.JsonSerializerSettings 实例的以下两个条件均可为 true,则会触发此规则:
呆呆
2022/02/20
6410
CA2100:检查 SQL 查询是否存在安全漏洞
一种方法使用按该方法的字符串参数生成的字符串设置 System.Data.IDbCommand.CommandText 属性。
用户4268038
2022/02/20
2.2K0
CA2301:在未先设置 BinaryFormatter.Binder
在未设置 Binder 属性的情况下调用或引用了 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 反序列化方法。
用户4268038
2022/02/26
7040
代码质量规则配置选项
除了配置严重性外,代码质量规则还有其他配置选项。 例如,可以将每个代码质量分析器配置为仅应用于代码库的特定部分。 通过向指定规则严重性和常规编辑器首选项的同一个 EditorConfig 文件添加键值对,可指定这些选项。
呆呆
2022/01/09
6900
类和对象的创建过程(元类,__new__,__init__,__call__)
一、 type() 1、创建类的两种方式 方式一 class MyClass(object): def func(self,name): print(name) myc = MyClass() print(MyClass, type(MyClass)) print(myc, type(myc)) 我们创建了一个名为MyClass的类,并实例化了这个类,得到其对象myc 上面代码打印的结果为: <class '__main__.MyClass'> <class 'type'>
用户1214487
2018/01/24
1.3K0
推荐阅读
相关推荐
CA1508:避免死条件代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档