指向二维数组元素的指针能否为NULL?LDRA静态分析疑问
关于LDRA静态分析告警及数组越界的指针问题
问题背景
LDRA静态分析工具对以下代码提出告警:
const float range_min = p_results_phase->range_min;
告警提示:指针p_results_phase需要进行NULL校验。
相关代码上下文如下:
- 函数声明中的数组参数:
void DrawVACalibrationVerificationResultsScreen(Cal_Ver_Results_t results[][CAL_VER_SI_COUNT], unsigned int test_num)
- 指针定义与使用的实际顺序(定义与使用之间无其他代码):
Cal_Ver_Results_t const * const p_results_phase = &results[test_num][CAL_VER_PHASE]; const float range_min = p_results_phase->range_min; const float range_max = p_results_phase->range_max;
- 结构体
Cal_Ver_Results_t定义:
typedef struct Cal_Ver_Results_s { float result1; float result2; float range_min; float range_max; _Bool pass; }Cal_Ver_Results_t;
提问者认为p_results_phase不可能为NULL,因为它指向数组results的内部位置,进而提出两个核心问题:
核心问题
- 若
test_num变量越界,指针p_results_phase会被赋值为NULL吗? - 若
CAL_VER_PHASE越界,指针p_results_phase会被赋值为NULL吗?
问题解答
test_num越界时:
不会被赋值为NULL。数组下标越界属于C语言中的未定义行为,此时&results[test_num][CAL_VER_PHASE]得到的是指向数组合法范围之外的野指针,其指向的是内存中某个随机的非法地址,而非NULL。CAL_VER_PHASE越界时:
同样不会被赋值为NULL。这也是数组越界导致的未定义行为,得到的依然是指向非法内存区域的野指针,并非NULL指针。
补充说明:LDRA的告警本质是工具无法自动确认test_num和CAL_VER_PHASE是否始终处于合法范围内,因此提示需要校验指针有效性。虽然该指针不会是NULL,但越界后的指针访问依然会引发程序崩溃、数据损坏等不可预期的问题,建议添加对test_num和CAL_VER_PHASE的边界合法性校验,而非针对指针的NULL校验。
内容的提问来源于stack exchange,提问作者Thomas Matthews
相关产品推荐
相关产品推荐

