C#源代码缺陷说明.docx
- 文档编号:8121004
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:23
- 大小:21.66KB
C#源代码缺陷说明.docx
《C#源代码缺陷说明.docx》由会员分享,可在线阅读,更多相关《C#源代码缺陷说明.docx(23页珍藏版)》请在冰豆网上搜索。
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)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 源代码 缺陷 说明