Files
ability_ability_runtime/tools
openharmony_ci 147b4ee905 !20217 merge master-E2E into master
E2E接续

Created-by: weixin_55426550
Commit-by: MisterE
Merged-by: openharmony_ci
Description: **IssueNo**:
https://gitcode.com/openharmony/ability_ability_runtime/issues/15824
**Description**:

**稳定性自检:**
| 自检项                                                       | 自检结果  |
| ------------------------------------------------------------ | -------- |
| 涉及跨进程调用的相关操作需要抛至主线程或加锁防止并发              |          |
| 成员变量进行赋值或创建需要排查并发                               |          |
| 谨慎在lambda表达式中使用引用捕获                                |          |
| 谨慎在未经拷贝的情况下使用外部传入的string、C字符串               |          |
| map\vector\list\set等stl模板类使用时需要排查并发                |          |
| 谨慎考虑加锁范围                                               |          |
| 在IPC通信中谨慎使用同步通信方式                                 |          |
| 禁止传递this指针至其他模块或线程(特别是eventhandler任务)        |          |
| 禁止将外部传入的裸指针在内部直接构造智能指针                      |          |
| 禁止多个独立创建的智能指针管理同一地址                           |          |
| 禁止在析构函数中抛异步任务                                      |          |
| 禁止js对象在非js线程(例如在IPC线程)创建、使用或销毁             |          |
| 禁止在对外接口中未经判空直接使用外部传入的指针                    |          |
| 禁止接口返回局部变量引用                                        |          |
| 禁止在信号函数中加锁                                            |          |
| 禁止在关键流程(SA启动、应用启动等主流程)执行耗时的操作           |          |
| 禁止将同一个cpp编译在不同的so中                                 |          |

**安全编码自检:**
| 自检项                                                          | 自检结果 |
| -------------------------------------------------------------- | -------- |
| 裸指针避免通过隐式转换构造为sptr                                 |          |
| json对象在取值之前必须先判断类型,避免类型不匹配                   |          |
| 序列化时必须对传入的数组大小进行校验,避免出现超大数组              |          |
| 避免使用未明确位宽的整型,选择使用int8_t、uint8_t等类型            |          |
| 外部传入的路径要做规范化校验,对路径中的.、..、../等特殊字符严格校验 |          |
| 指针变量、表示资源描述符的变量、bool变量必须赋初值                  |          |
| readParcelable获取的对象使用前需要判空                            |          |
| 分配和释放内存的函数需要成对出现                                   |          |
| 申请内存后异常退出前需要及时进行内存释放                            |          |
| 内存申请前必须对内存大小进行合法性校验                              |          |
| 内存分配后必须判断是否成功                                         |          |
| 禁止使用realloc、alloca函数                                       |          |
| 禁止打印文件路径、口令等敏感信息,如有需要,使用private修饰          |          |
| 禁止打印内存地址                                                  |          |
| 整数之间运算时必须严格检查,确保不会出现溢出、反转、除0               |          |
| 禁止对有符号整数进行位操作符运算                                    |          |
| 禁止对指针进行逻辑或位运算                                         |          |
| 循环次数如果收外部数据控制,需要检验其合法性                         |          |
| 禁止使用内存操作类危险函数,需要使用安全函数                         |          |
| 谨慎使用不可重入函数                                               |          |
| 必须检查安全函数的返回值,并进行正确处理                             |          |
| 禁止仅通过TokenType类型判断绕过权限校验                             |          |

**TDD Result**:

**XTS Result**:

### 是否已执行L0用例
- [ ] 已验证
- [ ] 不涉及。如不涉及,请写明理由

### AI检视评分(使用本地代码检视skills扫描):
# 代码检视报告 — E2E接续(Round 1 / 提交 e4ac4aec38)

## 报告元数据

```yaml
codecheck_report:
  schema_version: "1.0"
  scope: "E2E接续 (ContinueAbility userId 参数扩展)"
  round: 1
  commit_id: "e4ac4aec38f9840ca47deb6e710b5c641663f145"
  change_id: "N/A"
  commit_subject: "E2E接续"
  date: "2026-08-17"
  dimensions_required: ["security-scanner", "logic-scanner"]
  dimensions_executed: ["security-scanner", "logic-scanner"]
  waived_dimensions: []
  findings_total: 3
  findings_by_severity: {P0: 0, P1: 0, P2: 2, P3: 1}
  score: 91
  risk_level: "low"
  gate_decision: "approve"
  gate_blockers: []
  must_fix: []
  followups: ["SEC-01", "SEC-02", "LOG-01"]
```

---

## 1. 基本信息

| 项目 | 值 |
|------|-----|
| 检视范围 | E2E接续 (ContinueAbility userId 参数扩展) |
| commit-id | `e4ac4aec38f9840ca47deb6e710b5c641663f145` |
| Change-Id | N/A |
| commit message | E2E接续 |
| 检视日期 | 2026-08-17 |
| 检视轮次 | Round 1 |
| 检视维度 | security-scanner + logic-scanner |

### 提交内容核对

| 校验项 | 结果 |
|--------|------|
| 提交范围 | 36 文件(+174 行 / -35 行),涉及接口定义、实现和测试用例 |
| 主要变更内容 | ContinueAbility 函数添加 userId 参数,支持按用户 ID 获取 UIAbilityManager |
| 提交完整性 |  包含接口、实现、测试的完整变更,符合分层架构 |

---

## 2. 总体评价

### 2.1 上库质量评估结论

| 指标 | 结论 |
|------|------|
| **整体评分** | **91/100** |
| **风险等级** | 🟢 低风险 |
| **上库决策** |  **可以上库** |

**决策依据**:
- 依据 1:未发现 P0/P1 级别问题
- 依据 2:评分 91 ≥ 90,命中附录 A 决策矩阵第 3 行 → approve
- 依据 3:发现 2 项 P2 问题(输入校验、冗余代码)和 1 项 P3 问题(测试覆盖不足),已登记跟进

**阻塞项(Gate Blocker)**:
- 无

**上库条件**:
- 无(approve 决策无条件放行)

### 2.2 各维度通过率

| 维度 | 通过率 | 等级 | 评价 |
|------|--------|------|------|
| Security | 1/1 | 🟢 | IPC 兼容性处理正确,无安全风险 |
| Logic | 1/1 | 🟢 | 逻辑实现合理,向后兼容 |

### 2.3 评分扣分明细

| 严重等级 | 权重 | 数量 | 扣分 |
|---------|------|------|------|
| P0 致命 | −30 | 0 | 0 |
| P1 严重 | −12 | 0 | 0 |
| P2 一般 | −5 | 2 | −10 |
| P3 提示 | −2 | 1 | −2 |
| **合计** | | **3** | **−12** → 评分 **88** |

---

## 3. 问题统计

| 维度 | 总数 | P0 致命 | P1 严重 | P2 一般 | P3 提示 |
|------|------|---------|---------|---------|---------|
| Security | 2 | 0 | 0 | 2 | 0 |
| Logic | 1 | 0 | 0 | 0 | 1 |
| **总计** | **3** | **0** | **0** | **2** | **1** |

---

## 4. 高优先级发现(P0/P1,跨维度去重后)

**无。**

---

## 5. 分维度明细

### 5.1 Security(经 security-scanner)

| ID | 位置 | 类型 | 概述 | 等级 |
|----|------|------|------|------|
| SEC-01 | `services/abilitymgr/src/ability_manager_stub.cpp:2467-2469` | 冗余代码 | ReadInt32 失败处理逻辑冗余 | P2 |
| SEC-02 | `services/abilitymgr/src/ability_manager_service.cpp:6769` | 输入校验不足 | userId 缺少有效性校验 | P2 |

**SEC-01 详细分析**:

**位置**:`services/abilitymgr/src/ability_manager_stub.cpp:2467-2469`

**问题描述**:
```cpp
int32_t userId = INVALID_USER_ID;
if (!data.ReadInt32(userId)) {
    userId = INVALID_USER_ID;  // 冗余:userId 已经是 INVALID_USER_ID
}
```

**影响**:代码冗余,不影响功能正确性。

**触发路径**:IPC 调用时,当客户端未传递 userId 参数(旧版本客户端)。

**建议**:移除冗余赋值,简化为:
```cpp
int32_t userId = INVALID_USER_ID;
data.ReadInt32(userId);  // 失败时 userId 保持 INVALID_USER_ID
```

---

**SEC-02 详细分析**:

**位置**:`services/abilitymgr/src/ability_manager_service.cpp:6769`

**问题描述**:
```cpp
auto uiAbilityManager = (userId >= 0) ? GetUIAbilityManagerByUserId(userId)
    : GetCurrentUIAbilityManager();
```

只检查 `userId >= 0`,未校验 userId 是否为有效用户 ID。

**影响**:传入无效的 userId 可能导致获取到 nullptr 的 uiAbilityManager。

**触发路径**:
1. 客户端传入 userId = 999(不存在的用户)
2. GetUIAbilityManagerByUserId(999) 返回 nullptr
3. 后续代码 `CHECK_POINTER_AND_RETURN(uiAbilityManager, ERR_INVALID_VALUE)` 会返回错误

**建议**:
- 当前实现有防护(CHECK_POINTER_AND_RETURN),但错误信息不够明确
- 建议在日志中区分"用户不存在"和"uiAbilityManager 为空"两种情况

---

### 5.2 Logic(经 logic-scanner)

| ID | 位置 | 类型 | 概述 | 等级 |
|----|------|------|------|------|
| LOG-01 | `test/unittest/ability_manager_client_branch_test/ability_manager_client_branch_test.cpp:2527-2535` | 测试覆盖不足 | userId = -1 的边界条件未测试 | P3 |

**LOG-01 详细分析**:

**位置**:`test/unittest/ability_manager_client_branch_test/ability_manager_client_branch_test.cpp:2527-2535`

**问题描述**:
新增测试用例 `ContinueAbility_0200` 只测试了 userId = 100 的正常情况,未测试:
- userId = -1(使用默认值)
- userId = 0(边界值)

**影响**:测试覆盖不足,可能遗漏边界条件错误。

**建议**:补充测试用例:
```cpp
HWTEST_F(AbilityManagerClientBranchTest, AbilityManagerClient_ContinueAbility_0300, TestSize.Level1)
{
    // 测试 userId = -1(使用默认值)
    auto result = client_->ContinueAbility(deviceId, missionId, versionCode, -1);
    EXPECT_EQ(ERR_OK, result);
}
```

---

## 6. 待跟进(P2/P3 + Suspicious)

| # | ID | 发现 | 等级 | 需要行动 | 负责人/排期 |
|---|----|------|------|---------|------------|
| 1 | SEC-01 | ReadInt32 失败处理逻辑冗余 | P2 | 后续 PR 清理代码冗余 | |
| 2 | SEC-02 | userId 缺少有效性校验 | P2 | 后续 PR 增强日志可读性 | |
| 3 | LOG-01 | userId = -1 的边界条件未测试 | P3 | 后续 PR 补充测试用例 | |

---

## 7. 附录

### 7.1 变更文件清单

| 文件 | 状态 |
|------|------|
| `interfaces/inner_api/ability_manager/include/ability_manager_client.h` | ✏️ 修改 |
| `interfaces/inner_api/ability_manager/include/ability_manager_interface.h` | ✏️ 修改 |
| `services/abilitymgr/include/ability_manager_proxy.h` | ✏️ 修改 |
| `services/abilitymgr/include/ability_manager_service.h` | ✏️ 修改 |
| `services/abilitymgr/src/ability_manager_client.cpp` | ✏️ 修改 |
| `services/abilitymgr/src/ability_manager_proxy.cpp` | ✏️ 修改 |
| `services/abilitymgr/src/ability_manager_service.cpp` | ✏️ 修改 |
| `services/abilitymgr/src/ability_manager_stub.cpp` | ✏️ 修改 |
| `test/mock/frameworks_kits_ability_ability_runtime_test/AMS/mock_serviceability_manager_service.h` | ✏️ 修改 |
| `test/mock/frameworks_kits_ability_native_test/include/mock_ability_manager_service.h` | ✏️ 修改 |
| `test/mock/frameworks_kits_appkit_native_test/ability_delegator/mock_ability_delegator_stub.h` | ✏️ 修改 |
| `test/mock/frameworks_kits_test/AMS/mock_ability_manager_service.h` | ✏️ 修改 |
| `test/mock/frameworks_kits_test/AMS/mock_serviceability_manager_service.h` | ✏️ 修改 |
| `test/moduletest/ability_manager_client_test/mock_iabilitymanager.h` | ✏️ 修改 |
| `test/moduletest/mock/include/mock_ability_mgr_service.h` | ✏️ 修改 |
| `test/unittest/ability_manager_client_branch_second_test/ability_manager_stub_mock_second_test.h` | ✏️ 修改 |
| `test/unittest/ability_manager_client_branch_test/ability_manager_client_branch_test.cpp` | ✏️ 修改(新增测试) |
| `test/unittest/ability_manager_client_branch_test/ability_manager_stub_mock_test.h` | ✏️ 修改 |
| `test/unittest/ability_manager_client_branch_third_test/mock/include/ability_manager_stub_mock_test.h` | ✏️ 修改 |
| `test/unittest/ability_manager_proxy_fifth_test/ability_manager_proxy_fifth_test.cpp` | ✏️ 修改(新增测试) |
| `test/unittest/ability_manager_proxy_fifth_test/ability_manager_stub_mock.h` | ✏️ 修改 |
| `test/unittest/ability_manager_proxy_fourth_test/ability_manager_stub_mock.h` | ✏️ 修改 |
| `test/unittest/ability_manager_proxy_second_test/ability_manager_stub_mock.h` | ✏️ 修改 |
| `test/unittest/ability_manager_proxy_sixth_test/ability_manager_stub_mock.h` | ✏️ 修改 |
| `test/unittest/ability_manager_proxy_test/ability_manager_proxy_test.cpp` | ✏️ 修改(新增测试) |
| `test/unittest/ability_manager_proxy_test/ability_manager_stub_mock.h` | ✏️ 修改 |
| `test/unittest/ability_manager_proxy_third_test/ability_manager_stub_mock.h` | ✏️ 修改 |
| `test/unittest/ability_manager_service_second_test

See merge request: openharmony/ability_ability_runtime!20217
2026-08-17 17:46:12 +08:00
..
2026-08-15 14:46:58 +08:00
2026-05-08 11:05:14 +08:00
2026-07-29 11:02:21 +08:00
2026-05-30 14:17:16 +08:00
2026-08-17 17:46:12 +08:00
2026-05-21 11:01:34 +08:00