C#源代码缺陷说明.docx

上传人:b****6 文档编号:8121004 上传时间:2023-01-28 格式:DOCX 页数:23 大小:21.66KB
下载 相关 举报
C#源代码缺陷说明.docx_第1页
第1页 / 共23页
C#源代码缺陷说明.docx_第2页
第2页 / 共23页
C#源代码缺陷说明.docx_第3页
第3页 / 共23页
C#源代码缺陷说明.docx_第4页
第4页 / 共23页
C#源代码缺陷说明.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

C#源代码缺陷说明.docx

《C#源代码缺陷说明.docx》由会员分享,可在线阅读,更多相关《C#源代码缺陷说明.docx(23页珍藏版)》请在冰豆网上搜索。

C#源代码缺陷说明.docx

C#源代码缺陷说明

C#源代码缺陷说明

1.1 资源管理类

资源泄漏

缺陷描述:

实现Idisposable接口的对象使用结束后未调用Dispose方法。

缺陷危害:

资源泄漏可能导致非托管资源长时间被占用而无法释放,进而可能导致资源耗尽而系统不可用。

修复或避错建议:

实现Idisposable接口的对象使用结束后调用Dispose方法释放非托管资源或者将实现Idisposable接口的对象放到using语句中。

示例1:

不规范用法

publicvoidExampleFun(stringname)

{

StreamReaderreader=newStreamReader(name);

//使用reader对象

...

}//方法退出前未释放reader对象的资源

示例2:

规范用法

publicvoidExampleFun(stringname)

{

StreamReaderreader=newStreamReader(name);

try

{

//使用reader对象

...

}

catch(Exceptione)

{

...

}

finally

{

reader.Close();//Close方法调用了Dispose方法释放reader对象的资源

}

}

示例3:

规范用法

publicvoidExampleFun(stringname)

{

using(StreamReaderreader=newStreamReader(name))

{

//使用reader对象

...

}

}

1.2 解引用类

null解引用

缺陷描述:

对于值可能为null的引用类型变量,未检查变量是否为null而直接解引用该变量。

缺陷危害:

null解引用会导致程序抛出NullReferenceException类型的异常。

修复或避错建议:

在解引用变量前检查变量是否为null并对变量值为null的情况进行处理。

示例4:

不规范用法

publicvoidExampleFun()

{

strings1=null;

strings2=s1.Trim();//null解引用

}

示例5:

规范用法

publicvoidExampleFun()

{

strings1=null;

if(s1!

=null)

{

strings2=s1.Trim();

}

}

1.3 控制语句类

用于控制程序流程的条件表达式为常量

缺陷描述:

用于控制程序流程的条件表达式的结果恒为真或恒为假。

缺陷危害:

用于控制程序流程的条件表达式为常量时,代码的部分分支路径永远不会被执行,条件表达式变得毫无意义。

当用于控制循环的条件表达式的结果恒为真时,可能导致程序进入死循环。

示例:

不规范用法

publicvoidExampleFun()

{

strings="";

if(s==null)//用于控制程序流程的条件表达式“s==null”恒为假

{

return;

}

}

“If”语句的“then”分支无语句

缺陷描述:

“If”语句的“then”分支无语句。

缺陷危害:

“If”语句的“then”分支无语句通常不是程序的本意。

“If”语句的“then”分支无语句通常是遗漏了代码,可能会导致程序出错或程序功能实现不正确。

修复或避错建议:

补充“then”分支的代码。

示例:

不规范用法

publicvoidExampleFun(booleancond)

{

if(cond)

{

//“If”语句的“then”分支无语句

}

}

“If”语句的“then”分支只有分号

缺陷描述:

“If”语句的“then”分支只有分号。

缺陷危害:

“If”语句的“then”分支只有分号通常不是程序的本意。

“If”语句的“then”分支只有分号通常是打字错误,可能会导致“If”语句的“then”分支部分的代码在不满足判断条件时也进行执行。

修复或避错建议:

修复打字错误。

示例:

不规范用法

publicvoidExampleFun()

{

inta=0;

if(a>0);//“If”语句的“then”分支只有分号

{

a++;

}

}

1.4 运算处理类

非法计算

缺陷描述:

对于某些算术运算的操作数,其取值是受到限制的,如%,/,%=,/=后面的除数都不应该为0。

一些数学函数的参数是有定义域的,如果变量的取值范围中包括不合法的数据则会引起异常。

如asin,acos,atan2,div,fmod,ldiv,log,log10,sqrt等。

缺陷危害:

非法计算错误会产生运行时异常处理逻辑,导致未知错误。

修复或避错建议:

在使用算术运算前应检查操作数或运算参数,判断其是否符合相应的约束,并对不符合的情况进行处理。

示例6:

不规范用法

publicvoidExampleFun(inti)

{

if(i<10)

{

i=20/i;//非法计算

}

}

示例7:

规范用法

publicvoidExampleFun(inti)

{

if((i<10)&&(i!

=0))

{

i=20/i;

}

}

公共引用类型重载等于运算符

缺陷描述:

公共的引用类型通过定义Equals方法重载等于运算符。

缺陷危害:

对于引用类型,默认的等于运算符通常是正确的,不需要重载。

即默认情况下,只有两个引用指向同一个对象时才相等。

若重载公共引用类型的等于运算符,可能导致对该类使用等于运算符时产生歧义。

示例:

不规范用法

publicclassMyClass

{

publicboolEquals(objecto)

{

...

}

}

精度丢失

缺陷描述:

两个整数相除,结果赋值给一个浮点类型的变量。

缺陷危害:

两个整数相除时,即使不能整除,其结果仍然为整数。

若程序的本意为获取相除后的浮点数,则会造成精度丢失。

修复或避错建议:

先将两个整数分别转换成浮点数类型后再进行相除运算。

示例8:

不规范用法

publicvoidfoo(inta,intb)

{

floatf;

f=a/b;//精度丢失

...

}

示例9:

规范用法

publicvoidfoo(inta,intb)

{

floatf;

f=((float)a)/((float)b);

...

}

浮点数的相等或不等比较

缺陷描述:

两个浮点型或双精度浮点型的值使用“==”或“!

=”运算符进行比较。

缺陷危害:

浮点数在计算机中的存储和计算是不精确的,因此对浮点数采用“==”或“!

=”运算符进行比较可能得到与期望结果相反的结果。

修复或避错建议:

通过计算两个浮点数之间的差的绝对值是否小于一个允许的误差值判断浮点数之间是否相等或不等。

示例:

不规范用法

publicboolExampleFun(doublea,doubleb)

{

if(a==b)//浮点数的相等比较

{

returntrue;

}

returnfalse;

}

自身相除或比较

缺陷描述:

在表达式中变量与自己相除或作比较。

缺陷危害:

自身相除或比较通常不是程序的本意,程序中可能存在打字错误,自身相除可能导致程序出错或程序功能实现不正确,自身比较可能导致部分代码永远不会被执行。

修复或避错建议:

修复程序中存在的打字错误。

示例10:

不规范用法

publicboolExampleFun(inta,intb)

{

if(a

{

returntrue;

}

returnfalse;

}

示例11:

规范用法

publicboolExampleFun(inta,intb)

{

if(a

{

returntrue;

}

returnfalse;

}

1.5 比较判断类

Equals方法的参数为对象自身

缺陷描述:

代码中调用Equals方法的对象和Equals方法的参数对象相同。

缺陷危害:

若代码中调用Equals方法的对象和Equals方法的参数对象相同,则返回值恒为true,当作为条件表达式用于控制程序流程时,代码的部分分支路径永远不会被执行,条件表达式无意义。

当作为条件表达式用于控制循环语句时,可能导致程序进入死循环。

示例:

不规范用法

publicvoidExampleFun()

{

strings="abc";

if(s.Equals(s))//“s.Equals(s)”恒为真

{

...

}

...

}

Equals方法的参数为null

缺陷描述:

调用Equals方法时参数为null。

缺陷危害:

调用Equals方法时参数为null则返回值恒为假,作为条件表达式时会导致部分代码永远不会被执行,条件表达式无意义。

示例:

不规范用法

publicvoidExampleFun()

{

strings="abc";

if(s.Equals(null))//“s.Equals(null)”恒为假

{

...

}

...

}

this引用与null比较

缺陷描述:

用this引用与null进行比较。

缺陷危害:

this引用不可能为null,因此使用this引用与null进行比较无意义。

修复或避错建议:

删除this引用与null进行比较的代码。

示例:

不规范用法

publicvoidExampleFun()

{

strings="abc";

if(this==null)//“this==null”恒为假

{

...

}

...

}

Equals方法的错误使用

缺陷描述:

Equals方法的错误使用情况包括:

两个数组间使用Equals方法进行比较、数组和非数组间使用Equals方法进行比较、不兼容的类型间使用Equals方法进行比较。

缺陷危害:

两个数组间使用Equals方法进行比较就相当于“==”运算符,比较的是数组对象的引用而不是数组的值,可能导致判断逻辑错误;数组和非数组间、不兼容的类型间使用Equals方法进行比较,比较的结果总是false,可能导致部分代码永远不会被执行,条件表达式无意义。

修复或避错建议:

两个数组间的值比较应对数组的每个元素的值分别进行比较,两个数组间的引用比较应使用“==”运算符。

示例:

不规范用法

publicclassMyClass

{

string[]names;

publicboolequals(Objecto)

{

if(!

(oisMyClass))

{

returnfalse;

}

MyClassm=(MyClass)o;

returnthis.names.Equals(m.names);//两个数组间采用Equals方法进行比较

}

}

值类型与null进行比较

缺陷描述:

当泛型中的类型参数没有限制为引用类型时,将该类型的变量与null进行比较。

缺陷危害:

当使用泛型时,若类型参数为值类型,将值类型的变量与null进行相等比较结果恒为假,导致部分代码永远不会被执行。

修复或避错建议:

限制泛型中的类型参数为引用类型。

示例12:

不规范用法

classMyClass

{

publicvoidExampleFun(Tt)

{

if(t==null)//t可能为值类型,将值类型与null进行相等比较结果恒为假

{

...

}

}

}

示例13:

规范用法

classMyClasswhereT:

class//限制参数类型T只能为引用类型

{

publicvoidExampleFun(Tt)

{

if(t==null)

{

...

}

}

}

1.6 类型转换类

类型转换错误

缺陷描述:

对象强制转换的目标类型不为对象创建时的类型或其父类。

缺陷危害:

对象强制转换的目标类型不为对象创建时的类型或其父类会导致程序抛出InvalidCastException类型的异常。

修复或避错建议:

如果不确定转换的目标类型是否为对象创建时的类型或其父类,可采用“as”关键字进行类型转换,并判断类型转换的结果是否为null。

示例14:

不规范用法

publicvoidExampleFun()

{

Objectobj="abc";

//obj对象为string类型,无法转换成StringBuilder类型

StringBuildersb=(StringBuilder)obj;

}

示例15:

规范用法

publicvoidExampleFun(Objectobj)

{

StringBuildersb=objasStringBuilder;

if(sb==null)

{

return;

}

}

1.7 声明定义类

相同标识符

缺陷描述:

局部变量或方法参数与类或结构体的成员变量具有相同的标识符。

缺陷危害:

当局部变量或方法参数与类或结构体的成员变量具有相同的标识符时,局部变量或方法参数会隐藏类或结构体的成员变量,使用时容易造成混淆。

示例:

不规范用法

publicclassMyClass

{

privateinta;

privatestrings;

publicvoidExampleFun(inta)//方法参数与类或结构体的成员变量具有相同的标识符

{

strings;//局部变量与类或结构体的成员变量具有相同的标识符

}

}

非构造器的方法命名与类名相同

缺陷描述:

方法命名与类名相同,且包含返回类型。

缺陷危害:

方法与构造器名字相同容易造成混淆,可能造成不期望的结果。

修复或避错建议:

对非构造器的方法进行命名时不要与类名相同。

若为构造器,则不应包含返回类型。

示例16:

不规范用法

publicclassMyClass

{

publicstringname;

publicvoidMyClass(stringname)//方法名与类名相同,返回类型为“void”

{

this.name=name;

}

}

示例17:

规范用法

publicclassMyClass

{

publicstringname;

publicMyClass(stringname)

{

this.name=name;

}

}

1.8 调用返回类

忽略只作用在返回值上的方法的返回值

缺陷描述:

调用只作用在返回值上的方法,该方法不改变其他对象的值,并且调用该方法的返回值未赋值给变量保存。

缺陷危害:

方法只作用在返回值上却忽略返回值则方法调用无任何意义,可能会导致程序出错或程序功能实现不正确。

修复或避错建议:

调用只作用在返回值上的方法时,保存方法的返回值。

示例18:

不规范用法

publicstringExampleFun(strings)

{

s.Trim();//未保存s.trim方法的返回值

returns;

}

示例19:

规范用法

publicstringExampleFun(strings)

{

stringstr;

str=s.Trim();

returnstr;

}

忽略新创建的对象

缺陷描述:

使用“new”关键字创建对象时,未保存对象的引用,也未直接调用对象的方法。

缺陷危害:

忽略新创建对象会造成程序代码难以理解,也有可能隐藏逻辑错误。

修复或避错建议:

保存新创建的对象的引用,或直接调用新创建的对象的方法。

示例20:

不规范用法

publicvoidExampleFun()

{

newObject();//新创建对象被忽略

...

}

示例21:

规范用法

publicvoidExampleFun()

{

Objecto=newObject();

...

}

1.9 冗余类

自我赋值

缺陷描述:

变量赋值给自己。

缺陷危害:

自我赋值通常是一个打字错误,可能会导致程序出错或程序功能实现不正确。

示例22:

不规范用法

publicvoidExampleFun()

{

stringt="abc";

strings;

t=t;//自我赋值

}

示例23:

规范用法

publicvoidExampleFun()

{

stringt="abc";

strings;

s=t;

}

变量赋值后未被使用

缺陷描述:

程序对变量赋值后,变量从未被使用。

缺陷危害:

在大多数情况下,未使用的变量属于程序的冗余代码,但也有可能是程序的逻辑错误造成变量赋值后未被使用。

修复或避错建议:

删除冗余代码或修复程序中的逻辑错误。

示例24:

不规范用法

publicstringExampleFun()

{

strings="abc";//变量s赋值后未被使用

return"def";

}

示例25:

规范用法

publicstringExampleFun()

{

strings="abc";

returns+"def";

}

使用变量时变量恒为null

缺陷描述:

在表达式中使用变量时变量恒为null。

缺陷危害:

在表达式中使用变量时变量恒为null通常不是程序的本意,可能是忘记了对变量进行赋值,可能会导致程序功能实现不正确。

修复或避错建议:

在使用变量前对变量进行赋值。

示例26:

不规范用法

publicstringExampleFun(stringfirstName,stringlastName)

{

stringfullName=null;

returnfullName;//name总是为null

}

示例27:

规范用法

publicstringExampleFun(stringfirstName,stringlastName)

{

stringfullName=null;

fullName=firstName+lastName;

returnfullName;

}

往容器中添加容器自身

缺陷描述:

在容器中调用addAll方法,但方法的参数是容器自身。

缺陷危害:

往容器中添加容器自身无意义。

示例:

不规范用法

publicvoidExampleFun(Collectionc)

{

c.addAll(c);//往容器中添加容器自身

return;

}

1.10 程序效率类

在循环体中使用“+”或“+=”运算符拼接字符串

缺陷描述:

在循环体中使用“+”或“+=”运算符拼接字符串。

缺陷危害:

在循环体中使用“+”或“+=”运算符拼接字符串可能会创建大量的字符串对象,从而导致程序执行效率低下。

修复或避错建议:

使用StringBuilder类完成字符串拼接后再转换为string类型字符串。

示例28:

不规范用法

publicstringExampleFun(intn,stringa)

{

stringb="";

for(inti=0;i

{

b+=a;//在循环体中使用“+=”运算符拼接字符串

}

returnb;

}

示例29:

规范用法

publicstringExampleFun(intn,stringa)

{

StringBuilderb=newStringBuilder();

for(inti=0;i

{

b.append(a);

}

returnb.ToString();

}

调用string.ToString方法

缺陷描述:

调用string.ToString方法。

缺陷危害:

调用string.ToString方法会创建额外的字符串对象,导致消耗更多的内存和降低程序的运行效率,无任何功能作用。

修复或避错建议:

直接使用string对象自身,避免调用string.ToString方法。

示例30:

不规范用法

publicstringExampleFun(stringa,Objectb)

{

returna.ToString()+b.ToString();//调用string.ToString方法

}

示例31:

规范用法

publicstringExampleFun(stringa,Objectb)

{

returna+b.ToString();

}

1.11 异常处理类

catch语句块为空

缺陷描述:

catch语句块中无任何语句。

缺陷危害:

catch语句块为空即捕获了异常但不对异常进行任何处理,这可能导致异常被忽略。

修复或避错建议:

对捕获的异常进行处理,如将异常记录到日志中。

示例:

不规范用法

publicvoidExampleFun()

{

try

{

...

}

catch(Exceptione)

{

//catch语句块为空

}

}

1.12 其他类

ReferenceEquals方法的参数为值类型

缺陷描述:

Object.ReferenceEquals方法的参数为值类型。

缺陷危害:

若Object.ReferenceEquals方法的参数为值类型,该方法的返回值恒为假,可能导致程序功能实现不正确。

示例:

不规范用法

publicboolExampleFun(inta,Objecto)

{

returnObject.ReferenceEquals(a,o);//a为值类型

}

空接口

缺陷描述:

是指接口没有声明任何成员且没有继承两个或两个以上的其他接口。

缺陷危害:

空的接口没有任何意义。

示例32:

不规范用法

//接口未继承其他接口且未声明任何成员

publicinterfaceEmptyInterface

{

}

示例33:

不规范用法

//接口只继承了一个接口且未声明任何成员

publicinterfaceMyInterface:

IComparable

{

}

构造器调用虚方法

缺陷描述:

构造器调用带有“virtual”关键字的方法。

缺陷危害:

在构造器中调用虚方法可能导致子类的构造器未执行前先执行子类的方法,即子类的实例未完成初始化之前先调用了子类的方法。

示例:

不规范用法

classMyClass

{

publicMyClass()

{

ExampleFun();//构造器调用虚方法

}

publicvirtualvoidExampleF

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1