cwe - 390:检测错误条件没有行动
视图定制的信息:
![]() ![]()
![]() ![]()
![]() ![]()
![]()
![]() 语言 类:不是特定于语言的患病率(待定) ![]()
示例1 下面的例子试图为一个角色分配内存。后调用malloc, if语句是用来检查是否malloc函数失败。
(坏的代码)
例如语言:C
foo = malloc (sizeof (char));/ /下一行检查malloc失败了
如果(foo = = NULL) {
/ /我们什么都不做只是忽略错误。 }malloc的条件成功地检测到一个空返回值表示失败,然而它不做任何事情来处理这个问题。未处理的错误可能意想不到的结果,可能导致程序崩溃或终止。 相反,如果块应该包含语句,试图解决问题或通知用户发生了一个错误,继续处理或执行一些清理和优雅的终止程序。下面的示例通知用户,malloc函数不分配所需的内存资源,并返回一个错误代码。
(好的代码)
例如语言:C
foo = malloc (sizeof (char));/ /下一行检查malloc失败了
如果(foo = = NULL) {
printf (" Malloc分配内存资源失败"); }返回1; 示例2 在接下来的c++方法readFile例子()将读取文件的名字是提供的输入参数,将返回文件的内容字符字符串。的方法调用open()和阅读()可能会导致错误,如果文件不存在或不包含任何数据。这些错误时将抛出is_open()方法和良好的()方法显示错误打开或读取文件。然而,这些错误并不是在catch语句处理。捕捉语句不执行任何处理意想不到的结果。在这种情况下,将返回一个空字符的字符串,和文件将不会被正确地关闭。
(坏的代码)
例如语言:c++
char * readfile (char *文件名){
尝试{
/ /打开输入文件
ifstream infile; infile.open(文件名); 如果(! infile.is_open ()) {
把“无法打开文件”+文件名; }/ /得到文件的长度 infile。seekg (0, ios:结束); int长度= infile.tellg (); infile。seekg (0, ios:请求); / /分配内存 char *缓冲= new char(长度); / /从文件读取数据 infile。阅读(缓冲区,长度); 如果(! infile.good ()) {
把“无法读取文件”+文件名; }infile.close (); 返回缓冲区; 抓住(…){
/ * bug:插入代码来处理这之后* / }捕捉语句应该包含语句,试图解决这个问题或者通知用户发生了一个错误,继续处理或执行一些清理和优雅的终止程序。以下c++示例包含两个捕捉语句。第一个将在try块捕获抛出一个特定的错误,和第二个语句将捕获所有其他错误在catch块。捕捉语句都将通知用户发生了一个错误,关闭文件,并重新抛出的块称为readFile()方法进行进一步处理或可能终止程序。
(好的代码)
例如语言:c++
char * readFile (char *文件名){
尝试{
/ /打开输入文件
ifstream infile; infile.open(文件名); 如果(! infile.is_open ()) {
把“无法打开文件”+文件名; }/ /得到文件的长度 infile。seekg (0, ios:结束); int长度= infile.tellg (); infile。seekg (0, ios:请求); / /分配内存 char *缓冲= new char(长度); / /从文件读取数据 infile。阅读(缓冲区,长度); 如果(! infile.good ()) {
把“无法读取文件”+文件名; }infile.close (); 返回缓冲区; 抓住(char * str) {
printf(“错误:% s \ n”, str); }infile.close (); str扔; 抓住(…){
printf(“错误发生试图读取文件\ n”); }infile.close (); 扔; 示例3 在接下来的Java示例方法readFile将读取文件的名字提供输入参数和返回文件的内容在一个字符串对象。FileReader对象的构造函数和读取方法调用可能抛出异常,因此必须在一个try / catch块。而抓住声明在本例将捕获抛出异常为了编译的方法,不执行处理处理抛出的异常。捕捉语句不执行任何处理意想不到的结果。在这种情况下,这将导致返回一个空字符串。
(坏的代码)
例如语言:Java
readFile公共字符串(字符串文件名){
字符串retString =零;
尝试{
/ /初始化文件和FileReader对象
文件文件=新文件(文件名); FileReader fr = new FileReader(文件); / /初始化字符缓冲区 长fLen = file.length (); char [] cBuf = new char [(int) fLen]; / /从文件读取数据 int iRead = fr.read (cBuf 0 (int) fLen); / /关闭文件 fr.close (); retString =新的字符串(cBuf);
/ *什么也不做,但抓住它会编译…* / }返回retString; 捕捉语句应该包含语句要么试图解决这个问题,通知用户已经抛出一个异常并继续处理,或执行一些清理和优雅的终止程序。下面的Java示例包含三个语句。第一个将赶上FileNotFoundException FileReader构造函数可能抛出的try / catch块中。第二个catch语句将赶上IOException可能抛出的try / catch块中调用读方法。第三抓住语句将捕获所有其他异常抛出在try块中。用户通知所有语句捕获的异常被抛出异常是rethrown块,称为readFile()方法进行进一步处理或可能终止程序。注意,与Java通常是良好的实践使用异常类的getMessage()方法向用户提供更多的信息关于异常了。
(好的代码)
例如语言:Java
readFile公共字符串(字符串文件名)抛出FileNotFoundException, IOException、异常{
字符串retString =零;
尝试{
/ /初始化文件和FileReader对象
文件文件=新文件(文件名); FileReader fr = new FileReader(文件); / /初始化字符缓冲区 长fLen = file.length (); char [] cBuf = new char [(int) fLen]; / /从文件读取数据 int iRead = fr.read (cBuf 0 (int) fLen); / /关闭文件 fr.close (); retString =新的字符串(cBuf);
System.err。println(“错误:FileNotFoundException打开输入文件:“+文件名); }捕捉(IOException ex) {System.err。println (" + ex.getMessage ()); 把新FileNotFoundException (ex.getMessage ());
System.err。println(“错误:IOException读取输入文件。\ n " + ex.getMessage ()); }捕捉(例外的前女友){把新的IOException(特异);
System.err。println(“错误:异常读取输入文件。\ n " + ex.getMessage ()); }抛出新的异常(例); 返回retString;
![]()
更多的信息是可用的,请选择一个不同的过滤器。
|
使用常见的弱点枚举(CWE)和相关的引用从这个网站的使用条款。CWE赞助的美国国土安全部(DHS)网络和基础设施安全机构(CISA)和管理的国土安全系统工程和发展研究所这是由(HSSEDI)manbetx客户端首页(斜方)。版权©2006 - 2023,斜方公司。manbetx客户端首页CWE、水煤浆、CWRAF, CWE标志是斜方公司的商标。manbetx客户端首页 |