You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指向二维数组元素的指针能否为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的内部位置,进而提出两个核心问题:

核心问题

  1. 若test_num变量越界,指针p_results_phase会被赋值为NULL吗?
  2. 若CAL_VER_PHASE越界,指针p_results_phase会被赋值为NULL吗?

问题解答

  1. test_num越界时:
    不会被赋值为NULL。数组下标越界属于C语言中的未定义行为,此时&results[test_num][CAL_VER_PHASE]得到的是指向数组合法范围之外的野指针,其指向的是内存中某个随机的非法地址,而非NULL。

  2. CAL_VER_PHASE越界时:
    同样不会被赋值为NULL。这也是数组越界导致的未定义行为,得到的依然是指向非法内存区域的野指针,并非NULL指针。

补充说明:LDRA的告警本质是工具无法自动确认test_num和CAL_VER_PHASE是否始终处于合法范围内,因此提示需要校验指针有效性。虽然该指针不会是NULL,但越界后的指针访问依然会引发程序崩溃、数据损坏等不可预期的问题,建议添加对test_num和CAL_VER_PHASE的边界合法性校验,而非针对指针的NULL校验。

内容的提问来源于stack exchange,提问作者Thomas Matthews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:47:28