| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
add retry and DFX for samgr Signed-off-by: zhenghui25 <zhenghui25@h-partners.com> AI[100%] Human Fixed[0%] Human[0%] AI Adopted[100%] Signed-off-by: zhenghui25 <zhenghui25@h-partners.com> Signed-off-by: zhenghui25 <zhenghui25@h-partners.com> Co-authored-by: opencode (glm-5.2) <ai@local> | 8 天前 | |
!3763 merge master into master feat: add DFX log for appAccount off_all unsubscribe scenario Created-by: zhenghui25 Commit-by: zhenghui25 Merged-by: openharmony_ci Description: feat: add DFX log for appAccount off_all unsubscribe scenario https://gitcode.com/openharmony/account_os_account/issues/3130   # 综合代码修改检视报告 ## 📋 检视摘要 (Executive Summary) ### 基本信息 | 项目 | 内容 | |------|------| | **提交哈希** | 5d4d381af951bfa4bac7216325e08a1268034252 | | **提交信息** | feat: add DFX log for appAccount off_all unsubscribe scenario | | **作者** | zhenghui25 <zhenghui25@h-partners.com> | | **提交日期** | 2026-08-11 | | **检视日期** | 2026-08-11 | | **变更文件** | 1 个 .cpp | | **变更行数** | +6 / -0 | | **变更类型** | DFX 日志增强(HiLog),非业务逻辑变更 | ### 变更内容 在 UnsubscribeExecuteCB 函数中,当 callbackRef == nullptr(即 off_all 场景:取消订阅指定 type 的所有订阅者)时,新增一条 ACCOUNT_LOGI 日志,记录操作类型和事件名称。 --- ### ✅ 检查项目清单 #### 🔐 Security Review(安全检查) - ✅ **内存安全**: asyncContextForOff 在 reinterpret_cast 后直接使用,无新增解引用——新增代码仅访问 callbackRef(napi_ref,CommonAsyncContext:43)和 type(std::string,AsyncContextForUnsubscribe:193),两者均为结构体已有成员,无新增内存风险 - ✅ **输入验证**: N/A(未引入外部输入处理) - ✅ **权限控制**: N/A(未引入权限相关变更) - ✅ **敏感信息**: type 字段值仅为 "change" 或 "accountChange"(ParseParametersByUnsubscribe:924 的校验),不含用户隐私数据,%{public}s 标注正确 - ✅ **并发安全**: UnsubscribeExecuteCB 在 napi async work 线程执行,asyncContextForOff 在此函数内独占使用(完成回调 UnsubscribeCallbackCompletedCB 才释放),无竞态 - ✅ **整数安全**: N/A **小计**: 6/6 通过 ✅ --- #### 🔍 Logic Analyzer(逻辑分析) - ✅ **off_all 判定逻辑正确**: callbackRef == nullptr 表示调用方未传入 callback 参数(ParseParametersByUnsubscribe:929:仅当 argc == UNSUBSCRIBE_MAX_PARA 时才解析 callbackRef),即 off_all 场景。在 UnsubscribeSync:1783-1798 和 GetSubscriberByUnsubscribe:877-905 中也以 callbackRef != nullptr 区分 off_single vs off_all,逻辑一致 - ✅ **日志位置正确**: 放在 for 循环之前,记录的是"批量取消订阅"操作的开始,不影响后续 UnsubscribeAppAccount 调用链 - ✅ **不影响现有控制流**: 新增代码仅为 if + LOGI,无 return/break/continue,不改变执行路径 - ✅ **errno 不受影响(Pitfall 4)**: ACCOUNT_LOGI 后面紧跟的是 AppAccountManager::UnsubscribeAppAccount(offSubscriber),不依赖 errno,且 UnsubscribeAppAccount 返回 ErrCode 而非使用 errno - ✅ **无对称性遗漏**: 这是首条 SubEvent op=off_all 日志,on(subscribe)侧当前无对应日志,但本次需求仅针对 off_all,不构成缺陷 **小计**: 5/5 通过 ✅ --- #### 📊 DFX Reviewer(DFX检查) - ✅ **客户端禁令**: 本文件位于 interfaces/kits/napi/(客户端 NAPI 层),但使用的是 **HiLog**(ACCOUNT_LOGI),不是 **HiSysEvent**。HiLog 在客户端允许使用,不违反"客户端禁止打点(HiSysEvent)"的禁令 - ✅ **日志格式规范**: SubEvent op=off_all kit=appAccountKit event=%{public}s 格式符合 key=value 键值对风格,包含 op(操作类型)、kit(所属 kit)、event(事件名)三个维度,便于过滤和统计 - ✅ **日志级别合理**: off_all 是低频但重要的批量操作,使用 ACCOUNT_LOGI(INFO 级别)而非 DEBUG,确保在默认日志级别下可观测 - ✅ **数据隐私**: type 字段值仅为 "change" 或 "accountChange"(已在 ParseParametersByUnsubscribe:924 校验),非用户数据,%{public}s 标注正确 - ✅ **无高频日志风险**: off_all 仅在用户主动取消全部订阅时触发,非热路径 **小计**: 5/5 通过 ✅ --- #### 📋 Code Review Checklist(规范检查) **兼容性检查**: - ✅ **API变更**: 无 — 仅新增日志,无 API 签名变更 - ✅ **IDL接口**: 无 IDL 变更 - ✅ **错误码**: 无错误码变更 - ✅ **on-disk schema**: 无数据格式变更 **AGENTS.md 约束检查**: - ✅ **§3.1 公共 API**: 未触及公共 API 签名 - ✅ **§3.1 SA 启动序列**: 未触及 account_mgr_service.cpp - ✅ **§3.4 Pitfall 4(errno)**: 不适用——后续调用不依赖 errno - ✅ **§3.4 Pitfall 3(敏感数据)**: type 非敏感数据 **空指针安全检查**: - ⚠️ **data 参数未做 nullptr 检查**: UnsubscribeExecuteCB 的 data 参数在 reinterpret_cast 前未检查 nullptr。但这是 **既有代码模式**(VerifyCredCompleteCB 也无检查),且 napi_create_async_work 的 data 参数由调用方保证非空(napi_app_account.cpp:1834 传入的 context 已在 :1808-1810 做了 new (std::nothrow) 空检查)。本次变更未引入新的空指针风险。 **小计**: 8/8 通过 ✅(含 1 个说明性备注) --- #### 🧪 Test Coverage Reviewer(测试覆盖度检查) - ✅ **修改点性质**: 新增 DFX 日志,非业务逻辑变更,无需新增测试用例 - ✅ **编译验证**: 提交前已在本地完成编译验证 - ✅ **回归验证**: 日志输出不影响功能行为,不需要功能测试 **小计**: 3/3 通过 ✅ --- #### 🎨 Coding Style Review(编码风格检查) - ✅ **缩进**: 4 空格,与函数体一致 - ✅ **大括号**: if 单语句使用大括号 {},符合规范 - ✅ **行宽**: L948 = 78 字符,L949 = 46 字符,均 ≤ 120 字符 - ✅ **日志格式**: ACCOUNT_LOGI 宏调用风格与文件中其他 27 处 ACCOUNT_LOGI 一致 - ✅ **%{public}s**: 与文件中现有 2 处 %{public}s 风格一致 - ✅ **注释**: // DFX log for off_all scenario 简洁说明意图 - ✅ **提交信息格式**: feat: <description> 符合 Conventional Commits 规范 - ✅ **DCO 签名**: Signed-off-by: zhenghui25 <zhenghui25@h-partners.com> 已包含 **小计**: 8/8 通过 ✅ --- ### 🎯 总体评价 | 维度 | 通过率 | 等级 | 评价 | |------|--------|------|------| | Security Review | 100% (6/6) | 🟢 优秀 | 无内存/并发/隐私风险 | | Logic Analyzer | 100% (5/5) | 🟢 优秀 | off_all 判定正确,不影响控制流 | | DFX Reviewer | 100% (5/5) | 🟢 优秀 | HiLog(非 HiSysEvent),格式规范,级别合理 | | Code Review Checklist | 100% (8/8) | 🟢 优秀 | 无兼容性风险,空指针为既有模式 | | Test Coverage Reviewer | 100% (3/3) | 🟢 优秀 | 仅 DFX 日志,无需测试 | | Coding Style Review | 100% (8/8) | 🟢 优秀 | 风格统一,DCO 签名完整 | **整体评分**: 100/100 (🟢 优秀) **整体风险等级**: 🟢 **低风险** **是否建议上库**: ✅ **是** --- ### 📊 问题统计 | 检查维度 | 问题总数 | 🔴 致命 | 🟠 严重 | 🟡 警告 | |---------|---------|---------|---------|---------| | Security Review | 0 | 0 | 0 | 0 | | Logic Analyzer | 0 | 0 | 0 | 0 | | DFX Reviewer | 0 | 0 | 0 | 0 | | Code Review Checklist | 0 | 0 | 0 | 0 | | Test Coverage Reviewer | 0 | 0 | 0 | 0 | | Coding Style Review | 0 | 0 | 0 | 0 | | **总计** | **0** | **0** | **0** | **0** | --- ## 🔍 检视依据(代码级证据) ### 1. off_all 判定逻辑正确性验证 **文件**: interfaces/kits/napi/appaccount/src/napi_app_account_common.cpp **参数解析** (line 929): cpp if ((argc == UNSUBSCRIBE_MAX_PARA) && (!GetCallbackProperty(env, argv[1], context->callbackRef, 1))) { → 仅当传入 2 个参数(type + callback)时才解析 callbackRef。当 argc==1(仅 type)时 callbackRef 保持为 nullptr。 **取消订阅逻辑** (napi_app_account.cpp:1783-1800): cpp if ((context->callbackRef != nullptr) && (!CompareOnAndOffRef(env, item->callbackRef, context->callbackRef))) { continue; // off_single: 跳过不匹配的 } // ... if (context->callbackRef != nullptr) { subscribe->second.erase(subscribe->second.begin() + index); break; // off_single: 取消一个后 break } // ... if ((context->callbackRef == nullptr) || (subscribe->second.empty())) { EraseAccountSubscribersMap(...); // off_all: 清空全部 } → callbackRef == nullptr 确实对应 off_all(取消全部订阅者)。 ### 2. type 字段值域验证 **文件**: napi_app_account_common.cpp:924: cpp if ((context->type != "change") && (context->type != "accountChange")) { context->errMsg = "Parameter error. The content of \"type\" must be \"change|accountChange\""; context->errCode = ERR_JS_INVALID_PARAMETER; return false; } → type 仅允许 "change" 或 "accountChange",非用户隐私数据,%{public}s 标注正确。 ### 3. HiLog vs HiSysEvent 区分 **本文件 HiSysEvent 使用数**: 0(grep -c "HiSysEvent\|REPORT_" = 0) **本文件 HiLog 使用数**: 70 条(ACCOUNT_LOGD/I/E/W 合计) → 使用 ACCOUNT_LOGI 是 HiLog,在客户端 NAPI 层允许使用,不违反"客户端禁止 HiSysEvent 打点"的禁令。 ### 4. data 参数空指针——既有模式 | 函数 | data nullptr 检查 | |------|-------------------| | UnsubscribeExecuteCB(本次变更) | ❌ 无(既有模式) | | UnsubscribeCallbackCompletedCB | ✅ 有(if (asyncContextForOff == nullptr) return;) | | VerifyCredCompleteCB | ❌ 无(既有模式) | → data 参数由 napi_create_async_work 传入,调用方 napi_app_account.cpp:1807-1834 已保证非空(new (std::nothrow) + 空检查)。本次变更未引入新的空指针风险。 ### 5. DCO 签名验证 Signed-off-by: zhenghui25 <zhenghui25@h-partners.com> ### 6. 行宽验证 L948: len=78: ACCOUNT_LOGI("SubEvent op=off_all kit=appAccountKit event=%{public}s", L949: len=46: asyncContextForOff->type.c_str()); → 均 ≤ 120 字符。 --- ## 总结与建议 ### 关键发现 本次提交无致命、严重、警告问题。所有 6 个检视维度均 100% 通过。 ### 最终评价 #### 代码质量评分 **整体评分**: 100/100 (🟢 优秀) | 维度 | 得分 | 等级 | 说明 | |------|------|------|------| | 安全性 | 100/100 | 🟢 优秀 | 无内存/并发/隐私风险 | | 逻辑正确性 | 100/100 | 🟢 优秀 | off_all 判定正确,不影响控制流 | | DFX规范性 | 100/100 | 🟢 优秀 | HiLog 格式规范,级别合理 | | 代码规范性 | 100/100 | 🟢 优秀 | 无兼容性风险 | | 测试覆盖度 | 100/100 | 🟢 优秀 | 仅 DFX 日志,无需测试 | | 编码风格 | 100/100 | 🟢 优秀 | 风格统一,DCO 签名完整 | #### 上库决策 **是否建议上库**: ✅ **是** #### 上库前置条件 - [x] 本地已进行编译验证 - [x] DCO 签名已包含 - [x] 无公共 API 变更 - [x] 无 on-disk schema 变更 - [x] 无 SA 启动序列变更 - [x] 无 feature flag 变更 --- ## 附录 ### A. 检查文件列表 interfaces/kits/napi/appaccount/src/napi_app_account_common.cpp ### B. 关联文件(用于逻辑追踪) interfaces/kits/napi/appaccount/include/napi_app_account_common.h (结构体定义) interfaces/kits/napi/appaccount/src/napi_app_account.cpp (调用方) interfaces/kits/napi/common/include/napi_account_common.h (CommonAsyncContext 基类) ### C. 检视信息 - **检视者**: AI Assistant (comprehensive_review skill v1.3) - **检视日期**: 2026-08-11 - **报告版本**: v1.0 --- **报告生成时间**: 2026-08-11 **报告生成工具**: Comprehensive Code Review Skill v1.3 See merge request: openharmony/account_os_account!3763 | 18 天前 |