文章目录
- SAP 上线前代码审查实战:
- @[TOC]
- 一、背景与目标
- 二、登录 SAP 并读取源码
- 三、快速定位程序
- 四、逐段静态代码审查
- 4.1 数据获取段(get_data)
- 4.2 排序段
- 4.3 ALV 初始化段(重要 Bug)
- 五、结论与发现汇总(Bug + 漏洞)
- 六、上线前必须处理的事项
- 七、用到了哪些 AI 技术?如何实现的
- 7.1 大语言模型(LLM)—— 核心推理引擎
- 7.2 Function Calling / Agent(ReAct)—— 决定"下一步做什么"
- 7.3 MCP(Model Context Protocol)—— 标准化连通 SAP
- 7.4 结构化输出 —— 结果可决策
- 7.5 技术栈全景图
- 7.6 一句话总结
- 八、总结
SAP 上线前代码审查实战:
Demo程序测试: 用 SAP 助手审查 ZDEMO_002 报表,揪出 5 个问题
本文以实际案例演示如何借助SAP MCP 助手对即将上线的 ABAP 程序进行上线前代码审查,从源码获取、静态分析、到问题定位与修复建议的全流程,帮助开发/ Basis 在上线前把 Bug 和安全漏洞拦在门外。
文章目录
- SAP 上线前代码审查实战:
- @[TOC]
- 一、背景与目标
- 二、登录 SAP 并读取源码
- 三、快速定位程序
- 四、逐段静态代码审查
- 4.1 数据获取段(get_data)
- 4.2 排序段
- 4.3 ALV 初始化段(重要 Bug)
- 五、结论与发现汇总(Bug + 漏洞)
- 六、上线前必须处理的事项
- 七、用到了哪些 AI 技术?如何实现的
- 7.1 大语言模型(LLM)—— 核心推理引擎
- 7.2 Function Calling / Agent(ReAct)—— 决定"下一步做什么"
- 7.3 MCP(Model Context Protocol)—— 标准化连通 SAP
- 7.4 结构化输出 —— 结果可决策
- 7.5 技术栈全景图
- 7.6 一句话总结
- 八、总结
文章目录
- SAP 上线前代码审查实战:
- @[TOC]
- 一、背景与目标
- 二、登录 SAP 并读取源码
- 三、快速定位程序
- 四、逐段静态代码审查
- 4.1 数据获取段(get_data)
- 4.2 排序段
- 4.3 ALV 初始化段(重要 Bug)
- 五、结论与发现汇总(Bug + 漏洞)
- 六、上线前必须处理的事项
- 七、用到了哪些 AI 技术?如何实现的
- 7.1 大语言模型(LLM)—— 核心推理引擎
- 7.2 Function Calling / Agent(ReAct)—— 决定"下一步做什么"
- 7.3 MCP(Model Context Protocol)—— 标准化连通 SAP
- 7.4 结构化输出 —— 结果可决策
- 7.5 技术栈全景图
- 7.6 一句话总结
- 八、总结
一、背景与目标
程序ZDEMO_002是一个展示物料主数据(MARA)前 100 行并用 SALV ALV 输出的演示报表,准备上线(release / transport)。上线前的代码审查目标:
自然语言描述
- 检测 Bug:潜在运行时报错、无效逻辑、对象未绑定导致短转储(Short Dump)等。
- 检测漏洞:权限校验缺失、敏感数据暴露、数据传输性等安全问题。
二、登录 SAP 并读取源码
通过 SAP 助手连接到 DEV 系统(客户端 100,语言 ZH),先确认连接与系统信息:
- 活动配置文件:
DEV||S4H(可读写) - 系统地址:`https://ip:端口
随后通过对象搜索定位程序:
searchObject: PROG/P ZDEMO_002 → name : ZDEMO_002 → type : PROG/P → packageName: $TMP ← ⚠️ 关键隐患(见后文) → description: Demo: Fetch 10 rows from MARA and show ALV并用getObjectSource读取完整源码(共 190 行)。
三、快速定位程序
| 项目 | 结果 |
|---|---|
| 对象名 | ZDEMO_002 |
| 对象类型 | PROG/P(可执行报表) |
| 所属包 | $TMP⚠️ |
| 功能 | 读取 MARA 前 100 行,SALV ALV 展示 |
四、逐段静态代码审查
4.1 数据获取段(get_data)
FORM get_data. SELECT matnr ersda ernam laeda aenam vpsta pstat lvorm mtart mbrsh matkl bismt FROM mara INTO TABLE gt_mara UP TO 100 ROWS. IF sy-subrc <> 0. MESSAGE 'No data found' TYPE 'S'. STOP. ENDIF. ENDFORM.审查点:
- ⚠️ “前 100 行”是无序的 TOP-N,后面又做
SORT,与“按 ERSDA 倒序取前 100”语义不一致。 - ⚠️ 硬编码消息文本
'No data found',建议改文本元素。 - 🔒没有 AUTHORITY-CHECK,直接读取展示物料主数据(含创建人/修改人),属越权风险。
4.2 排序段
FORM sort_data. SORT gt_mara BY ersda DESCENDING. ENDFORM.本身无错,但与 4.1 的“TOP-N 无序”叠加导致最后展示的“前 100”并非真正的 ERSDA 最新 100 条,建议在 SQL 中ORDER BY ersda DESCENDING。
4.3 ALV 初始化段(重要 Bug)
FORM init_alv. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = go_alv CHANGING t_table = gt_mara ). CATCH cx_salv_msg INTO DATA(lx_msg). MESSAGE lx_msg TYPE 'E'. " ← 仅报错,流程未中止 ENDTRY. ENDFORM. FORM set_functions. go_funcs = go_alv->get_functions( ). " ← go_alv 若未绑定 → SHORT DUMP ENDFORM.问题:当factory抛出异常时,CATCH只弹出一条报错,没有RETURN/STOP,事件继续执行。随后set_functions、set_columns、set_layout等都会对一个未绑定的对象引用操作 →运行期短转储(Short Dump,CX_SY_REF_IS_INITIAL)。
建议:
CATCH cx_salv_msg INTO DATA(lx_msg). MESSAGE lx_msg TYPE 'I'. " 或 E RETURN. " ← 中止初始化 ENDTRY. ... IF go_alv IS NOT BOUND. RETURN. ENDIF.五、结论与发现汇总(Bug + 漏洞)
| No. | 问题 | 级别 | 说明 |
|---|---|---|---|
| 1 | 对象位于$TMP包,无法传输上线 | 🔴 阻断 | $TMP是本地私有包,无法建传输请求,无法随请求发布。上线前必须迁到正式开发包。 |
| 2 | 缺少 AUTHORITY-CHECK(权限校验) | 🟠 安全 | 读取并展示敏感主数据(MATNR/ERNAM/AENAM…),无权限校验,存在越权/泄露。 |
| 3 | SALV factory 失败后go_alv未绑定 → 可能 SHORT DUMP | 🟠 Bug | CATCH 仅报错未中止,后续流程对未绑定引用操作。 |
| 4 | 硬编码消息文本,STOP语义不清 | 🟡 次要 | 应用文本元素,避免硬编码。 |
| 5 | TOP-N 无序 + 冗余SORT | 🟡 次要 | 建议 SQLORDER BY ersda DESCENDING。 |
六、上线前必须处理的事项
- 迁移包:将 ZDEMO_002 从
$TMP迁到正式开发包(Z 开头,配置传输层)。 - 补权限校验:在
START-OF-SELECTION前加AUTHORITY-CHECK(如S_TABU_DIS_TYPE或物料授权对象)。 - 修复异常处理:
factory异常后RETURN,并校验go_alv是否已绑定。 - 规范消息与 SQL:文本元素化、
ORDER BY前置排序。
七、用到了哪些 AI 技术?如何实现的
这套"上线前代码审查"的完整流程,本质上是SAP 系统 + AI 大模型(LLM)+ Agent(工具调用)+ MCP四层协作。逐层拆解:
7.1 大语言模型(LLM)—— 核心推理引擎
所有"看得懂 ABAP、能找 Bug、能写报告"的能力都来自 LLM:
- 代码理解:对 190 行 ABAP 源码做语义理解,读懂字段、FORM、SELECT、SALV 调用链。
- Bug / 漏洞检测:不是规则匹配,而是基于模型掌握的大量 ABAP 最佳实践与 SALV 使用经验做"跨语句推理",例如:
- 从
CATCH cx_salv_msg只报错不中断,推出后续go_alv->get_functions( )会因引用未绑定而SHORT DUMP; - 从读取 MARA 却无任何鉴权,推出越权暴露风险;
- 从
packageName = $TMP,结合传输机制常识,推出无法建传输请求、不能直接上线。
- 从
- 报告 / 文章生成:把发现整理成结构化表格、mermaid 流程图,并输出成可直接发布的 CSDN 文档。
7.2 Function Calling / Agent(ReAct)—— 决定"下一步做什么"
LLM 本身无法访问 SAP,必须靠"Agent"式的思考 → 选工具 → 看返回 → 再思考循环(ReAct: Reason + Act)自动编排:
| 步骤 | 模型决策 | 调用的工具 | 目的 |
|---|---|---|---|
| 1 | 先确认连哪个系统 | listConnectedSystems | 选择可读写的 `DEV |
| 2 | 先定位对象 | searchObject | 找到PROG/P类型的 ZDEMO_002,顺带暴露包名$TMP |
| 3 | 拉取完整源码 | getObjectSource | 分页读取 190 行 |
| 4 | 二次语法校验 | syntaxCheckCode | 验证代码可编译 |
7.3 MCP(Model Context Protocol)—— 标准化连通 SAP
- 作用:把 SAP内置能力封装成一个个标准"工具(Tool)“,每个工具都有标准 JSON Schema(入参/出参),LLM 才能知道"能调什么、传什么、返回什么”。
- 优势:即插即用、屏蔽底层协议。更换模型,同一套工具依然复用;封装后无需直接拼 ADT HTTP 细节。
- 本案例中用到的 MCP 工具即
getObjectSource、searchObject、syntaxCheckCode等。
7.4 结构化输出 —— 结果可决策
- 让模型**按"表格 + 严重级别 + 修复建议"**输出审查结果,而不是一大段描述;
- 修复动作不自动执行,而是把问题列给你,由你选择"修哪些",保持人对上线变更的把控权。
7.5 技术栈全景图
7.6 一句话总结
上面的审查不是"凭空写的",而是LLM(听懂 ABAP + 找 Bug)+ Agent(决定调哪个 SAP 工具)+ MCP(把 ADT/RFC 封装成标准工具连上真实 SAP)三者分工协作:
MCP 负责"接上系统"、Agent 负责"决定动作"、LLM 负责"看懂代码、判断风险并给出建议"。
八、总结
借助SAP 助手可以在上线前快速:
- 读取并审查 ABAP 对象源码;
- 识别运行期 Bug(未绑定引用、异常未终止);
- 识别安全/权限漏洞(缺 AUTHORITY-CHECK);
- 识别上线流程阻断点(
$TMP包无法传输)。
上线前代码审查 ≠ 只在代码看一遍,更要关注:权限校验、异常分支、数据敏感度、对象归属包(可传输性)。把上述 5 个问题在 release 前解决,能显著降低生产事故与安全风险。
🧪 本文案例来源于一次真实的 ZDEMO_002 上线前审查演练,文中代码行号与字段已做脱敏简化。
感谢阅读,希望对你的 SAP 上线前审查工作有帮助。有用请点赞·收藏·关注!