- E04:调用 Z 对象/引用 Z 结构前,必须 sap-cli info/download/read-table DD02L 核实对象真实存在且名称逐字符一致 - E05:参数名/类型/顺序以核实到的函数签名为准(函数头 Local Interface 节),结构组件以 DD02L/DD03L 实查为准 - 根因:ADT syntax-check 只覆盖当前对象自身,不校验被调函数存在性与结构匹配——本地全绿≠运行期不转储 - SKILL.md 质检标准行同步(28→38 条口径修正 + E04/E05 强制标注)
6.0 KiB
6.0 KiB
ABAP 编码规则(质检标准)
维护者:Rangyu | 版本:v1.0 | 2026-08-05
本规则文档由 Rangyu(老板)维护,质检员在代码审计时以此文档为唯一标准。 质检结果分为:✅合规 / ❌违规(必须修复) / ⚠️建议(推荐修复)
1. 安全规则(Security)
| ID | 规则 | 判定 | 示例 |
|---|---|---|---|
| S01 | 生产代码中禁止硬断点(BREAK-POINT) | ❌违反 | BREAK-POINT. → 删除 |
| S02 | 关键数据访问前必须 AUTHORITY-CHECK | ❌违反 | 聊天记录读取、配置维护、表维护 |
| S03 | SQL 注入防护:所有变量必须用 @ 转义 | ✅合规 | WHERE field = @lv_var |
| S04 | 敏感数据(聊天内容、用户信息)需脱敏或审计 | ⚠️建议 | zidt_chatlog message_body 字段 |
| S05 | |||
| S06 | |||
| S07 |
(Rangyu 补充更多安全规则...)
2. 性能规则(Performance)
| ID | 规则 | 判定 | 示例 |
|---|---|---|---|
| P01 | 禁止 SELECT *,仅查询所需字段 |
⚠️建议 | SELECT field1, field2 FROM ... |
| P02 | 禁止无 WHERE 条件的全表扫描(小配置表除外) | ⚠️建议 | SELECT ... FROM ztable WHERE ... |
| P03 | 大表查询必须有索引支撑 | ⚠️建议 | SE11 检查索引 |
| P04 | 循环内禁止 SQL 查询 | ❌违反 | LOOP 内 SELECT |
| P05 | 循环字符串拼接用 CONCATENATE 单次操作 |
⚠️建议 | 避免 LOOP 内 && |
| P06 | |||
| P07 |
(Rangyu 补充更多性能规则...)
3. 可维护性规则(Maintainability)
| ID | 规则 | 判定 | 示例 |
|---|---|---|---|
| M01 | 重复代码超过 80% 相似 → 提取公共方法/FORM | ❌违反 | 3处 AI 调用重复约 90% |
| M02 | 每个 FORM/方法不超过 200 行 | ⚠️建议 | |
| M03 | 禁止裸硬编码字符串(模型名、GUI状态、事务码) | ⚠️建议 | 用常量 CONSTANTS c_model TYPE ... VALUE 'qwq-32b' |
| M04 | 关键逻辑必须有注释 | ⚠️建议 | |
| M05 | 无用变量/死代码必须清理 | ⚠️建议 | gs_tool-END 赋值未消费 |
| M06 | |||
| M07 |
(Rangyu 补充更多可维护性规则...)
4. 错误处理规则(Error Handling)
| ID | 规则 | 判定 | 示例 |
|---|---|---|---|
| E01 | sy-subrc <> 0 后不能静默处理 |
❌违反 | IF sy-subrc <> 0. " 错误处理 ENDIF. → 必须 MESSAGE/EXIT |
| E02 | API 调用必须有异常保护(CATCH) | ⚠️建议 | HTTP 调用、RFC 调用 |
| E03 | 数据库操作必须有错误处理 | ⚠️建议 | COMMIT/ROLLBACK |
| E04 | CALL FUNCTION 前必须核实被调对象真实存在:ADT 通道无法校验被调函数与引用结构是否存在(syntax-check 只覆盖当前对象自身),凡调用 CALL FUNCTION 'Z...' 或引用 Z... 结构/表类型,必须先用 sap-cli(info/download/read-table DD02L 任一)确认对象存在且名称逐字符一致,再落代码 |
❌违反 | 凭记忆写 CALL FUNCTION 'ZMM_BIP_CREATE'(实际对象是 ZMM_BIP_VENDOR_CREATE)→ 编译期不报错、运行期 CALL_FUNCTION_NOT_FOUND 转储。正确:先 sap-cli info --name 组名/函数名 --type function 查实,再写调用 |
| E05 | CALL FUNCTION 的参数结构必须与被调函数真实签名一致:IMPORTING/EXPORTING/CHANGING/TABLES 各参数名、类型、顺序以核实到的函数签名为准(info 输出或 download 函数源码的 Interface 节),不得按猜测拼参数;引用的 DDIC 结构(如 TYPE zmm_bip_001_in)须同批核实结构存在且组件名/类型一致 |
❌违反 | CALL FUNCTION 'X' EXPORTING iv_a = lv 但实际签名参数是 IS_IMPORT → 运行期 PARAMETER_NOT_FOUND/类型不匹配转储。正确:以 download 拿到函数头 `"*" Local Interface: 注释节为准逐参数比对,结构组件以 DD02L/DD03L 实查为准 |
(Rangyu 补充更多错误处理规则...)
E04/E05 背景(2026-09-10 老板指令):远程语法检查不校验被调函数的存在性与签名匹配——本地语法全绿 ≠ 运行期不转储。开发报表/程序中所有
CALL FUNCTION(尤其调用本组外/客户化 Z 对象)一律先核实后调用,核实记录(对象存在性 + 签名比对)纳入交付物。
5. NW 7.40 兼容规则(7.40 Compatibility)
| ID | 规则 | 判定 | 示例 |
|---|---|---|---|
| C01 | 禁止 DATA(...) inline 声明 |
❌违反 | DATA(lv_x) = ... → DATA lv_x TYPE ... |
| C02 | Open SQL @ 转义全局一致 |
❌违反 | 不能混用 @lv 和 lv |
| C03 | 禁止字符串模板 |...| |
❌违反 | 用 CONCATENATE 代替 |
| C04 | 禁止 WITH EMPTY KEY |
❌违反 | 用 WITH DEFAULT KEY |
| C05 | LOOP AT SCREEN 逻辑避免重复 | ⚠️建议 | 提取公共 FORM |
| C06 | |||
| C07 |
(Rangyu 补充更多 7.40 兼容规则...)
6. 代码风格规则(Style)
| ID | 规则 | 判定 | 示例 |
|---|---|---|---|
| T01 | 命名遵循 SAP 规范(Z开头自定义) | ✅合规 | ZIDTR_AI_ASSISTANT |
| T02 | 变量命名语义化 | ⚠️建议 | lv_date 优于 lv_d |
| T03 | 注释语言统一(中/英) | ⚠️建议 | |
| T04 | |||
| T05 |
(Rangyu 补充更多风格规则...)
附录:今天质检发现的典型违规
| 程序 | 问题 | 规则ID | 行号 |
|---|---|---|---|
| ZIDTR_AI_ASSISTANT | 生产代码 BREAK-POINT | S01 | L44 |
| ZIDTR_AI_ASSISTANT | 权限检查缺失 | S02 | 全文 |
| ZIDTR_AI_ASSISTANT | 3处代码重复~90% | M01 | L464-667 |
| ZIDTR_AI_ASSISTANT | 硬编码模型名 | M03 | L207 |
| ZIDTR_AI_ASSISTANT | F4错误静默处理 | E01 | L170-172 |
| ZIDTR_AI_ASSISTANT | DATA(...) inline | C01 | L152等6处 |
| ZIDTR_AI_ASSISTANT | @转义混用 | C02 | L154/259 |
使用方式:质检员读取本文件 → 逐条对照代码 → 输出
✅/❌/⚠️审计报告。维护方式:Rangyu 随时增删规则,更新后通知小迅同步到质检员的审查标准。