Closed
[Bug-Report|缺陷反馈]: 用于内存分配的缓冲区大小计算错误 - test_geir_extract_glimpse_v2.cpp #730
zhangjunkai9Add on Aug 9Closed at Aug 20
Aug 9 Modify description of issue
liu-wei
Aug 10 Comments:
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 判空和释放逻辑。


Aug 10 Assign nunnons2 as responsible person
Aug 10 Removed responsible person nunnons2
ideal_
Aug 10 Comments:
Aug 10 Comments:
/assign


Aug 10 Assign wang-shilong32 as responsible person
Aug 20 Close issue
Aug 20 Added label: resolved
基本信息
incorrectMemoryAllocationSizeimage/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cppGenOnesData漏洞描述
GenOnesData函数中,data_len为字节总数(size * GetDataTypeSize(data_type)),但第149行 new int32_t[data_len] 将其作为元素个数使用,导致分配内存为实际需求的4倍。对比同文件GenOnesDataFloat32函数(第131行 new float[size])正确使用元素个数size,此处应为 new int32_t[size]。

二次复核
经复核源代码确认:第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倍过度分配传播路径:
image/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp:144 行 size = 1 初始化元素计数器image/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp:145-147 行 for循环累乘shapes各维度得到元素总数sizeimage/extract_glimpse_v2/examples/arch35/test_geir_extract_glimpse_v2.cpp:148 行 data_len = size * GetDataTypeSize(data_type) 将元素数乘以类型字节数,得到字节总数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];