1. 威客安全首页
  2. 安全资讯

【缺陷周话】第55期:返回值未初始化

【缺陷周话】第55期:返回值未初始化

 

1、返回值未初始化

在函数返回语句中,如果将未初始化变量返回,而函数的调用方对该返回值进行了使用,会因使用的变量未初始化,造成程序运行产生意料之外的行为。

详细请参见CWE-665: Improper Initialization
 

2、“返回值未初始化”的危害

返回值未初始化的危害取决于函数调用方对未初始化返回值的使用,通常会触发非预期的程序行为 

3、示例代码

示例源于toyota-itc-benchmarks-master (https://github.com/regehr/itc-benchmarks),源文件名:uninit_var.c。

3.1 缺陷代码

【缺陷周话】第55期:返回值未初始化

在上述示例代码中,第71行声明 int 类型变量 ret,但没有进行初始化,第72行通过 if 语句进行条件判断,当条件成立的情况下,为 ret 赋值为1,在第74行通过return 语句返回。由于 if(0) 恒为 false,因此 ret 不会被赋值,当第74行返回时,返回值是未初始化的,存在“返回值未初始化”问题。

使用代码卫士对上述示例代码进行检测,可以检出“返回值未初始化”缺陷,显示等级为中。如图1所示:

【缺陷周话】第55期:返回值未初始化

图1:“返回值未初始化”检测示例

3.2 修复代码

【缺陷周话】第55期:返回值未初始化

在上述修复代码中,修改第72行的 if 语句条件,对 ret 进行赋值,当第74行进行返回时,此时 ret 已经被赋值,从而避免了返回值未初始化问题。

使用代码卫士对修复后的代码进行检测,可以看到已不存在“返回值未初始化”缺陷。如图2:

【缺陷周话】第55期:返回值未初始化

图2:修复后检测结果

 

4、如何避免“返回值未初始化”

(1)在进行变量声明时,应考虑对其进行初始化(或采用默认初始化的策略)。
(2)使用源代码静态分析工具,可以有效检出源代码中的未初始化问题。

原文链接:https://www.anquanke.com/post/id/188805

本站声明:网站内容来源于安全客,如有侵权,请联系我们,我们将及时处理。

本文转为转载文章,本文观点不代表威客安全立场。