| name | ascendc-code-review |
| description | Ascend C 代码检视技能。基于假设检验方法论对代码进行安全规范检视。当用户提供代码片段和检视规则描述时,可使用此技能进行代码检视,使用时必须明确提供:代码片段和检视规则描述。 |
Ascend C 代码检视技能
核心原则
- 合规映射 - 所有检视动作映射至编码规范具体条款,确保 100% 覆盖
- 假设检验驱动 - 采用假设检验方法论,系统性收集证据判定风险
- 可审计可复用 - 检视动作全程日志记录,证据链完整可追溯
调用接口
必需参数
调用此技能时,必须明确提供以下参数:
参数1:代码片段
参数2:检视规则描述
- 明确指定要检视的问题类型
- 例如:
检查整数溢出、检查内存泄漏、检查空指针解引用等
- 或指定具体的规范文件路径
参数3:规范文件路径(可选)
- 指定具体的编码规范文件路径
- 如果未指定,默认使用
references/C++SecureCoding.md(安全编码规范)
参数校验
如果缺少任何一个必需参数,应:
- 明确通知用户缺少哪些参数
- 放弃执行检视
- 提示用户提供完整参数
规范文档体系
安全编码规范
C++ 安全编码规范 references/C++SecureCoding.md
| 属性 | 说明 |
|---|
| 性质 | 安全编码核心条款 |
| 内容 | 总体原则、数值运算安全、内存与指针安全、输入验证、资源管理、文件IO安全、并发安全、安全函数使用、类与对象安全、标准库安全 |
| 适用场景 | C++ 代码安全性检视 |
条款分类:
- 数值安全:整数溢出、无符号回绕、除零保护
- 内存安全:未初始化变量、空指针解引用、数组越界、资源泄漏
- 输入验证:外部数据校验、路径规范化、缓冲区溢出防护
- 并发安全:临界资源保护、线程安全
- 安全函数:危险函数替代、返回值检查
Python 安全编码规范 references/PythonSecureCoding.md
| 属性 | 说明 |
|---|
| 性质 | Python 安全编码规范 |
| 内容 | 数值安全、异常处理、文件操作、序列化、命令执行、网络安全 |
| 适用场景 | Python 代码安全性检视 |
质量规范
C++ 代码风格规范 references/C++CodeStyle.md
| 属性 | 说明 |
|---|
| 性质 | 代码风格规范 |
| 内容 | 命名规则、格式规范、注释规范 |
| 适用场景 | 代码风格、可读性检视 |
C++ 通用编码规范 references/C++GeneralCoding.md
| 属性 | 说明 |
|---|
| 性质 | 通用编码规范 |
| 内容 | 代码设计、数据类型、函数设计等 15 类规范 |
| 适用场景 | 代码质量、可维护性检视 |
流程规范
安全设计规范 references/SecureDesign.md
| 属性 | 说明 |
|---|
| 性质 | 安全设计规范 |
| 内容 | 认证/鉴权/传输/加密/密钥管理 |
| 适用场景 | 架构设计、模块设计检视 |
安全编译规范 references/SecureCompilation.md
| 属性 | 说明 |
|---|
| 性质 | 安全编译规范 |
| 内容 | ASLR/栈保护/GOT只读/立即绑定/堆栈不可执行 |
| 适用场景 | 编译配置、构建脚本检视 |
检视流程(假设检验驱动)
阶段一:准备
- 校验必需参数是否完整
- 根据检视规则描述或指定路径读取编码规范文件
- 确认待检视的代码片段
- 选择适用的规范文档:
- C++ 代码安全性:使用
C++SecureCoding.md
- Python 代码安全性:使用
PythonSecureCoding.md
- 代码风格质量:使用
C++CodeStyle.md 或 C++GeneralCoding.md
- 架构设计:使用
SecureDesign.md
- 编译配置:使用
SecureCompilation.md
阶段二:假设检验(核心)
步骤1:代码段识别
将目标代码划分为独立的代码段(函数、语句块、逻辑单元)
步骤2:假设建立
对每个代码段建立假设:
- 原假设 H0:该代码段是安全的
- 备择假设 H1:该代码段存在风险
- 自信值初始化:0%
步骤3:证据收集与评估
按维度系统性寻找证据:
| 证据类型 | 分析动作 | 分值规则 |
|---|
| 规范违反 | 对照规范条款识别违规点 | 有效证据 +40% |
| 上下文防御缺失 | 检查作用域内是否有防御代码 | 无防御 +30% |
| 函数调用链风险 | LSP/Grep 分析调用函数内部逻辑 | 发现风险 +25% |
| 数据流追踪风险 | 分析变量来源、运算过程 | 发现风险 +25% |
分析要求:
- 使用 LSP 获取代码中的符号定义,使用 Grep 查找依赖关系
- 风险代码必须检查是否在当前文件作用域内的其他位置进行防御
- 遇到函数调用,必须查看函数内部逻辑并综合判断
- 遇到存在风险的结构体或成员变量,必须查看定义和运算过程
步骤4:证据有效性校验
排除误报:
- 已在作用域其他位置进行有效防御 → 排除
- 上下文可证明不可能触发风险 → 排除
步骤5:决策判断
计算自信值并决策:
- 自信值 = Σ 有效证据分值
- 决策规则:当自信值超过 60% 时,判定代码段存在风险,进入报告生成;否则继续检查下一代码段
阶段三:报告生成
- 按代码检视报告模板格式生成报告
- 每个问题详情前展示假设检验过程(证据链和自信值计算过程)
- 明确标注违反规范的条款编号和来源文档
注意事项
- 请先完整阅读对应的编码规范文件,并根据这些规范进行代码检视,其他的一概不统计
- 检视过程中,存疑代码块存在函数调用行为,必须使用 LSP 或搜索工具进行深层次分析
- Ascend C 相关基础 API 在
/home/developer/Ascend/cann/ 中,请在该目录下搜索 Ascend C 基础 API 实现
- 不确定的编码规范问题,在输出报告中以存疑的形式进行列举,供用户自主判断
- 检视报告中列举的问题代码不宜过长,描述清晰问题代码即可
- 返回检视结果时,必须仔细检查结果中风险代码行的行数是否正确
- 返回检视结果时,所有风险代码块都应该被引用,不能只展示一个行数
红线问题
- Host侧代码必须对除法、求余操作做除零保护
- Host侧代码数组访问,必须进行越界保护
- Host侧代码加法、乘法、减法操作,必须进行溢出和减翻保护
- Host侧代码指针操作,必须先赋值后访问,并进行指针保护, 例如const bool* getLogtarget = attrs->GetAttrPointer(LOGTARGET_INDEX); this->logTarget_ = *getLogtarget,此操作无指针保护
- 变量使用前,必行进行有效初始化,例如类成员变量需要初始化
- 申请资源,使用和释放必须匹配
TOPN问题
- Host侧代码必须校验函数返回值
- Host侧代码不要使用GetInputTensor获取Shape和Dtype,使用GetInputDesc获取的对象来获取Dtype,使用context获取对应的Shape
- Host侧代码在生命周期内使用局部变量指针,避免野指针
- Host侧代码获取属性需要从context获取,不允许使用CompileInfo传递算子属性值
- Host侧代码属性的获取,要用ir原型对应的类型去获取。host侧代码做此检查,例如swiglu_mx_quant_def.cpp文件中activate_dim 是Int,activate_left是bool,clamp_limit是float,round_mode是string,那么获取activate_dim应该是auto *attrActivateDim = attrs->GetAttrPointer<int64_t>(INDEX_ATTR_ACTIVATE_DIM),activate_left应该是auto *attrActivateLeft = attrs->GetAttrPointer(INDEX_ATTR_ACTIVATE_LEFT),clamp_limit应该是auto *attrClampLimit = attrs->GetAttrPointer(INDEX_ATTR_CLAMP_LIMIT),round_mode应该是const char *attrRoundMode = attrs->GetAttrPointer(INDEX_ATTR_ROUND_MODE), attrs->GetAttrPointer<int32_t>(INDEX_ATTR_ACTIVATE_DIM)就是错误的,和ir原型属性类型不符,attrs->GetAttrPointer(INDEX_ATTR_ACTIVATE_LEFT)也是错误的
- 算子设计时必须考虑nan/inf/-inf/+0/-0等特殊值和边界值处理
- 融合规则、InferShape、Tiling的外部输入使用时必须进行合法性校验
- 涉及gm内存偏移或者大小必须用int64表示
- atomic累加指令需要src(ub)与dst(gm)做清零处理
- 可整数计算时不允许转浮点数计算,必要时转更高精度类型
- 涉及到和通信算子融合时,多轮计算和集合通信之间需要增加核间同步
- 宏定义中临时变量命名不能和外部变量冲突
- 由dlopen,dlclose管理的so,禁止使用thread_local申明变量
输出规范
检视报告必需包含
- 检视类别(标注规范来源)
- 风险点列表(含行号、代码片段)
- 证据链(展示假设检验过程)
- 建议修复方案
- 规范条款引用(标注条款编号和来源文档)
输出格式
详见:agents/ascendc-ops-reviewer/style/code_review_summary_style.txt