| D&C 示例代码修复
Co-authored-by: jiangxiuhan1<jiangxiuhan@huawei.com>
# message auto-generated for no-merge-commit merge:
!4371 merge master into master
D&C 示例代码修复
Created-by: jiangxiuhan1
Commit-by: jiangxiuhan1
Merged-by: cann-robot
Description: ## 描述
IS_TEST_* 需要手动设置,直接运行示例代码,没有设置IS_TEST_* 会导致 example 运行失败,example daily会运行失败;
修复上述问题,将原先独立的IS_TEST_A3和IS_TEST_A5布尔标志合并为统一的IS_TEST_A3A5标志,并设置为true,可直接运行示例代码。
## 关联的Issue
https://gitcode.com/cann/ops-transformer/issues/1948
## 测试
<!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。-->
## 文档更新
<!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。-->
## 类型标签
<!-- [x] 表示选中 -->
- [ ] 🐛 Bug 修复
- [ ] ✨ 新特性
- [ ] ⚡ 性能优化
- [ ] ♻️ 重构
- [ ] 🧪 测试
- [ ] 📦 构建/CI
- [ ] 🔧 配置变更
- [x] 📝 文档更新
- [ ] ⬆️ 依赖升级
- [ ] 🔒 安全修复
- [ ] 🧹 代码清理
- [ ] ❓ 其他,请描述:
# 代码检视报告
**检视文件**:test_aclnn_moe_distribute_combine_v2.cpp
**检视类别**:C++ 安全编码规范(Host 侧测试代码)
**规范来源**:cpp-secure.md、ascendc-topk.md
**检视时间**:2026-04-20
---
## 风险点列表
### 【中风险】问题1:LOG 参数类型不匹配
**代码位置**:116-118 行、80 行
```cpp
LOG_PRINT("[INFO] rank = %d, ...", args.rankId, ...); // args.rankId 是 uint32_t,应用 %u
LOG_PRINT("[ERROR] aclrtMalloc failed. ret: %d\n", ret); // ret 是 int,%d 正确
```
**假设检验过程**:
| 证据类型 | 分析动作 | 分值 |
|---------|---------|------|
| 规范违反 | 规则 11.3:LOG 参数类型与格式化说明符不匹配 | +40% |
| 上下文防御缺失 | 无类型检查 | +30% |
**自信值**:70%(> 60%,判定存在风险)
**规范条款**:规则 11.3 LOG API 参数类型必须与格式化说明符匹配 [适用: Tiling]
**建议修复**:uint32_t 类型使用 %u 而非 %d。
---
### 【中风险】问题2:资源释放后未置空
**代码位置**:315-320 行、576-581 行
```cpp
if (dispatchV2WorkspaceSize > 0) {
aclrtFree(dispatchV2WorkspaceAddr);
// 释放后未置 nullptr
}
```
**假设检验过程**:
| 证据类型 | 分析动作 | 分值 |
|---------|---------|------|
| 规范违反 | 规则 3.2:资源释放后指针应置新值 | +40% |
| 上下文防御缺失 | 后续无重复使用,但不符合规范 | +20% |
**自信值**:60%(= 60%,判定存在风险)
**规范条款**:规则 3.2 指向资源句柄的变量,在资源释放后立即赋予新值 [适用: Tiling]
**建议修复**:
```cpp
if (dispatchV2WorkspaceSize > 0) {
aclrtFree(dispatchV2WorkspaceAddr);
dispatchV2WorkspaceAddr = nullptr;
}
```
---
### 【中风险】问题3:函数返回值未校验
**代码位置**:768-772 行
```cpp
if (IS_TEST_A2) {
int ret = run_example_on_A2(); // 返回值未使用
}
else if (IS_TEST_A3A5) {
int ret = run_example_on_A3A5(); // 返回值未使用
}
```
**假设检验过程**:
| 证据类型 | 分析动作 | 分值 |
|---------|---------|------|
| 规范违反 | TOPK 问题1:必须校验函数返回值 | +40% |
| 上下文防御缺失 | 未处理执行失败情况 | +30% |
**自信值**:70%(> 60%,判定存在风险)
**规范条款**:TOPK 问题清单 规则 1 必须校验函数返回值 [适用: Host]
---
## 检视总结
| 风险级别 | 数量 | 问题类型 |
|---------|------|---------|
| 中风险 | 3 | LOG类型不匹配、资源释放后未置空、返回值未校验 |
# 代码检视报告
**检视文件**:test_aclnn_moe_distribute_dispatch_v2.cpp
**检视类别**:C++ 安全编码规范(Host 侧测试代码)
**规范来源**:cpp-secure.md、ascendc-topk.md
**检视时间**:2026-04-20
---
## 风险点列表
### 【中风险】问题1:LOG 参数类型不匹配
**代码位置**:115 行、361 行
```cpp
LOG_PRINT("[INFO] rank = %d, ...", args.rankId, ...); // args.rankId 是 uint32_t,应用 %u
```
**假设检验过程**:
| 证据类型 | 分析动作 | 分值 |
|---------|---------|------|
| 规范违反 | 规则 11.3:LOG 参数类型与格式化说明符不匹配 | +40% |
| 上下文防御缺失 | 无类型检查 | +30% |
**自信值**:70%(> 60%,判定存在风险)
**规范条款**:规则 11.3 LOG API 参数类型必须与格式化说明符匹配 [适用: Tiling]
---
### 【中风险】问题2:资源释放后未置空
**代码位置**:314-318 行、572-577 行
```cpp
if (dispatchV2WorkspaceSize > 0) {
aclrtFree(dispatchV2WorkspaceAddr);
// 释放后未置 nullptr
}
```
**假设检验过程**:
| 证据类型 | 分析动作 | 分值 |
|---------|---------|------|
| 规范违反 | 规则 3.2:资源释放后指针应置新值 | +40% |
| 上下文防御缺失 | 后续无重复使用,但不符合规范 | +20% |
**自信值**:60%(= 60%,判定存在风险)
**规范条款**:规则 3.2 指向资源句柄的变量,在资源释放后立即赋予新值 [适用: Tiling]
---
### 【中风险】问题3:函数返回值未校验
**代码位置**:763 行、767 行
```cpp
if (IS_TEST_A2) {
LOG_PRINT("Example on <Atlas A2> will be executed!\n");
int ret = run_example_on_A2(); // 返回值未使用
}
else if (IS_TEST_A3A5) {
LOG_PRINT("Example on <Atlas A3> or <Atlas A5> will be executed!\n");
int ret = run_example_on_A3A5(); // 返回值未使用
}
```
**假设检验过程**:
| 证据类型 | 分析动作 | 分值 |
|---------|---------|------|
| 规范违反 | TOPK 问题1:必须校验函数返回值 | +40% |
| 上下文防御缺失 | 未处理执行失败情况 | +30% |
**自信值**:70%(> 60%,判定存在风险)
**规范条款**:TOPK 问题清单 规则 1 必须校验函数返回值 [适用: Host]
---
## 检视总结
| 风险级别 | 数量 | 问题类型 |
|---------|------|---------|
| 中风险 | 3 | LOG类型不匹配、资源释放后未置空、返回值未校验 |
See merge request: cann/ops-transformer!4371 | 1 个月前 |