Closed
[Bug-Report|缺陷反馈]: 用于内存分配的缓冲区大小计算错误 - test_geir_extract_glimpse_v2.cpp #730
zhangjunkai9Add on  Aug 9Closed at  Aug 20
zhangjunkai9
Aug 9 Create

基本信息

  • 漏洞类型: incorrectMemoryAllocationSize
  • 文件: image/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp
  • 函数: GenOnesData
  • 行号: 149

漏洞描述

GenOnesData函数中,data_len为字节总数(size * GetDataTypeSize(data_type)),但第149行 new int32_t[data_len] 将其作为元素个数使用,导致分配内存为实际需求的4倍。对比同文件GenOnesDataFloat32函数(第131行 new float[size])正确使用元素个数size,此处应为 new int32_t[size]。
image.png
二次复核

经复核源代码确认:第144行 size = 元素总数,第148行 data_len = size * GetDataTypeSize(data_type) 为字节总数,第149行 new int32_t[data_len] 将字节总数作为int32_t数组元素个数,实际分配 data_len*4 字节。对比同文件GenOnesDataFloat32函数(第131行 new float[size])正确使用size作为元素个数,此处确实应为 new int32_t[size]。该文件为测试代码(examples/arch35/test_geir_...),但缺陷模式客观存在,分配内存为实际需求的4倍。

数据流证据

  • 源头: image/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp:144 行 size_t size = 1 计算元素总数

  • 问题点: image/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp:149 行 int32_t* pData = new (std::nothrow) int32_t[data_len] 将字节总数作为元素个数分配,导致4倍过度分配

  • 传播路径:

    1. image/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp:144 行 size = 1 初始化元素计数器
    2. image/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp:145-147 行 for循环累乘shapes各维度得到元素总数size
    3. image/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp:148 行 data_len = size * GetDataTypeSize(data_type) 将元素数乘以类型字节数,得到字节总数
    4. image/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp:149 行 new int32_t[data_len] 错误地将字节总数data_len作为int32_t数组元素个数,实际分配 data_len*4 字节,为所需 size*4 字节的4倍

调用链

无调用链信息

修复建议

int32_t* pData = new (std::nothrow) int32_t[size];
likedislike
Zzhangjunkai9
Aug 9 Modify description of issue
liu-wei
liu-weiCollaborators
Aug 10 Comments:

已确认该问题成立。GenOnesData 中 data_len 表示字节数,但当前使用 new int32_t[data_len] 将其当作 int32_t 元素个数进行分配,导致样例代码内存过度分配;同文件 GenOnesDataFloat32 使用 new float[size],这里也应按元素个数 size 分配。该问题位于 examples/arch35 GEIR 样例中,主要影响是过度分配和代码不严谨,并非分配不足或越界写。建议修改为 new (std::nothrow) int32_t[size],同时可补充 pData 判空和释放逻辑。

likedislike
liu-weiliu-weiCollaborators
Aug 10 Assign nunnons2 as responsible person
liu-weiliu-weiCollaborators
Aug 10 Removed responsible person nunnons2
ideal_
ideal_
Aug 10 Comments:

/assign

likedislike
CANN-robotCANN-robotCollaborators
Aug 10 Assign wang-shilong32 as responsible person
CANN-robotCANN-robotCollaborators
Aug 20 Close issue
CANN-robotCANN-robotCollaborators
Aug 20 Added label: resolved