已开启
【缺陷报告】访问未初始化的指针 - 文件memory_manager.h - 函数MemoryChunkList - 行号81 #162
zhangjunkai9创建于  9月14日
zhangjunkai9
9月14日 创建

缺陷信息

缺陷类型AccessOfUninitializedPointer (访问未初始化的指针)
函数MemoryChunkList
文件src/memory_manager.h
行号81
置信度90%
分析模型N/A

缺陷描述

MemoryChunkList 构造函数(src/memory_manager.h:81-84)初始化列表仅初始化 head 与 freeList,遗漏成员 chunkNumber(src/memory_manager.h:193 声明,无默认初始化值)。构造函数体调用 AllocateChunk(),其第148行对 chunkNumber 执行 ++chunkNumber,构成对不确定值的首次读取(UB),此后 chunkNumber 恒为 不确定值+1,永远无法表达真实 chunk 数量。该类被实例化为 JSVM_Env__ 的成员 scopeMemoryManager(src/jsvm_env.h:213),随每个 JSVM 环境创建(OH_JSVM_CreateEnv / OH_JSVM_CreateEnvFromSnapshot,src/js_native_api_v8.cpp:1352/1418)必然构造,缺陷可达性完整;随后每次 CloseHandleScope / CloseEscapableHandleScope(src/js_native_api_v8.cpp:3984/4028)触发 Delete() 第116行以 chunkNumber > threshold(实例化参数 sizePerChunk=8, threshold=10)决定是否 FreeChunk,阈值判断基于不确定值,可能导致 chunk 被过早释放或永不释放,破坏 handle scope 内存池管理;FreeChunk 第185行 --chunkNumber 还可能在垃圾初值上继续运算甚至下溢。

事实核查

核查1:构造函数(81-84行)初始化列表仅含 head/freeList,成员 chunkNumber(第193行声明)无默认值;

构造体调用 AllocateChunk(),第148行 ++chunkNumber 构成对不确定值的首次读取(UB),此后 chunkNumber 恒为不确定值+1;

第116行 Delete() 以该不确定值做阈值判断、第185行 FreeChunk 继续在其上递减,属访问未初始化变量的危险语义(所标类型的合理变体),模式成立。

核查2:无任何防护或默认初始化。

核查3:jsvm_env.h:213 行 scopeMemoryManager 为 JSVM_Env__ 成员,随 OH_JSVM_CreateEnv(js_native_api_v8.cpp:1352)/OH_JSVM_CreateEnvFromSnapshot(1418行)每个环境创建必然构造,函数可达。

核查4:无需特定外部条件,每个 JSVM 环境创建即触发未初始化读取,且每次 CloseHandleScope/CloseEscapableHandleScope(3984/4028行)进入第116行基于垃圾值的阈值判定,可能导致 chunk 过早释放或永不释放,触发必然满足。

确认缺陷。

数据流证据

Source(问题源头)

src/memory_manager.h:193 行 size_t chunkNumber; 成员声明,无默认初始化值(不确定值)

Sink(问题爆发点)

src/memory_manager.h:116 行 if (UNLIKELY(chunkNumber > threshold && chunk->CanBeFree())) 基于不确定值的 chunkNumber 做阈值判断决定是否 FreeChunk(另 src/memory_manager.h:148 行 ++chunkNumber 为对不确定值的首次读取,UB)

传播路径:

# 文件 行号 说明
1 src/memory_manager.h 81 构造函数初始化列表 head(nullptr), freeList(nullptr),遗漏 chunkNumber
2 src/memory_manager.h 83 构造函数体调用 AllocateChunk()
3 src/memory_manager.h 148 ++chunkNumber 对未初始化成员自增,首次读取不确定值,之后 chunkNumber 恒为不确定值+1
4 src/jsvm_env.h 213 ScopeMemoryManager scopeMemoryManager 成员实例化 MemoryChunkList<MaxSize<...>>(sizePerChunk=8, threshold=10 取默认),随 JSVM_Env__ 构造必然执行缺陷构造函数
5 src/js_native_api_v8.cpp 1352 OH_JSVM_CreateEnv 中 new JSVM_Env__(isolate, JSVM_API_VERSION) 触发 scopeMemoryManager 构造(OH_JSVM_CreateEnvFromSnapshot src/js_native_api_v8.cpp:1418 同)
6 src/js_native_api_v8.cpp 3984 env->scopeMemoryManager.Delete(...)(CloseHandleScope 路径;Escapable 版本 src/js_native_api_v8.cpp:4028)进入缺陷判定逻辑
7 src/memory_manager.h 116 Delete() 中 chunkNumber > threshold 使用不确定值决定是否 FreeChunk(FreeChunk 内 src/memory_manager.h:185 行 --chunkNumber 继续在不确定值上递减)

调用链

可达调用链1 起点:(entry functions) → 终点:MemoryChunkList::MemoryChunkList 深度:0

# 文件 函数 函数起始行 调用点行
1 src/memory_manager.h:MemoryChunkList: MemoryChunkList 81 —

修复建议

MemoryChunkList() : head(nullptr), freeList(nullptr), chunkNumber(0)
{
    AllocateChunk();
}
// 或在成员声明处给默认值:size_t chunkNumber = 0;
likedislike
openharmony_ci
openharmony_ci成员
9月14日 评论:

感谢提交Issue!关于Issue的交互操作,请访问OpenHarmony社区支持命令清单。如果有问题,请联系 [@knightaoko](https://gitcode.com/knightaoko) [@mschen7](https://gitcode.com/mschen7) [@jeff_liuwenbin](https://gitcode.com/jeff_liuwenbin) 。如果需要调整订阅PR、Issue的变更状态,请访问链接。


Thanks for submitting the issue. For more commands, please visit OpenHarmony Command List. If you have any questions, please refer to committer gitcode for help. If you need to change the subscription of a Pull Request or Issue, please visit the link.

likedislike
openharmony_ciopenharmony_ci成员
9月14日 添加了label:waiting_for_assign