如何扫描ABAP代码? (转)
原文地址:https://blogs.sap.com/2019/04/22/how-to-scan-abap-code/
编者按:很多企业在使用SAP的过程中,难免会进行大量的定制化开发,随着使用时间的增加,这些定制开发也会不停的进行优化或演进。久而久之,大量的定制开发的管理就会成为难题,有的年久未用,有的甚至不知道开发的本意,当然更多情况是随着数据的增加,性能出现问题,一个事物跑个几分钟出不来结果。为了更好的管理和优化定制化开发,扫描不失为一个好办法,这篇文章,就是对于ABAP扫描的入门,或许会对您的企业有所启发,或许您可以在此基础上,找到更适合的定制开发自动化管理办法。
出于不同目的,在SAP系统中扫描ABAP代码对于收集不同类型的信息很有用。
例如 :
检测ABAP级别的安全漏洞
检测ABAP代码中的硬编码值
获取自定义开发中使用的外部RFC调用的列表
获取数据库表的列表 - 使用的字段(例如,在S/4 HANA转换之前)
在我的公司Novaline中,我们编写了一个名为“ABAP Optimizer”的工具,
它可以扫描ABAP代码中的性能漏洞,然后自动进一步修改ABAP代码以进行性能优化。下面这篇文章也是方面的介绍:
https://blogs.sap.com/2019/04/03/how-to-code-an-automated-sap-performance-tuner/
在本文中,我将分享一些关于扫描ABAP代码的编码细节。
1.
基础:阅读ABAP源代码
基本上我们可以使用ABAP命令
“READ REPORT”读取ABAP的源代码。
以下是一份简单的报告:

要获取此源代码,我们可以使用“READ REPORT”命令,如下所示:

READ REPORT命令用字符串内部表“gt_source”填充报告“ZTEST”的源代码。
通过这样做,我们只将源代码作为纯字符串表。
然而,只是编写一个只搜索ABAP代码中某些特定文本的简单ABAP扫描程序,我们可以简单地从SAP视图TRDIR中读取自定义报告列表,并通过“READ REPORT”命令逐个读取它们的ABAP代码。最后我们可以在代码中进行简单的文本搜索。
SAP程序“RS_ABAP_SOURCE_SCAN”已经在进行此搜索,您可以参考它作为示例。下面的链接解释了它的优点:
https://sap4tech.net/find-string-sap-abap-code/
那么解释代码呢?我们来详细介绍一下。
2.
解释ABAP代码
很久以前,当我第一次尝试编写SAP安全扫描程序工具代码时,我花了很多时间在“SAP Code Inspector”工具上,并尝试了解它如何分析ABAP代码并进行检测。
以下是我们进一步研究之前,需要了解的一些重要概念:
概念:
标记化:意味着将ABAP代码从纯字符串解析为有意义的结构。如果您喜欢像我一样阅读理论,可以到下面的链接中查阅:
https://en.wikipedia.org/wiki/Lexical_analysis
声明:我们用句点完成的每个ABAP命令
Token:ABAP语句中的每个单词都是一个标记。无论是ABAP关键字,文字还是变量名称都无关紧要
结构:一些语句彼此绑定。例如,ABAP LOOP语句以代码中某处的ENDLOOP语句结束,因此它们都呈现结构
所以想象一下ABAP代码部分如下:
让我们把概念放在上面:

您可以在通过READ REPORT命令获取代码后解析字符串以获取这些结构,或者您可以使用SAP代码检查器中的现有类来使其更简单。为此检查标准类“CL_CI_SCAN”。(它基本上使用SCAN ABAP-SOURCE命令。)
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapscan.htm
那么通过使用这个逻辑和信息,如何编写ABAP解释器?
如上所述对代码进行标记后,第二步应该是分析您感兴趣的命令。解释取决于您要检测的内容。
让我们继续下面的示例场景。
基本示例:
让我们编写一个ABAP扫描程序,它检测与“*”一起使用的SELECT命令,以读取所有数据库表字段。
步骤应如下所示:
1. 对代码进行标记
2. 循环所有语句并检测SELECT命令
3. 解析SELECT命令并找到与星号“*”一起使用的命令
想象一下如下的小型ABAP计划:

读取VBAP表的第二个SELECT语句与星号“*”一起使用,我们试图检测这些SELECT语句。
让我们在ABAP中对扫描器进行编码:
3.
对ABAP代码进行标记
在下面的报告代码中,参数“p_prog”将是系统中现有的ABAP程序名称。

让我们为上面的程序“ZTEST”运行它并在调试器中显示对象“gr_scan”,在这个对象上可以看到“statements”和“tokens”表:

让我们显示“tokens”表:

并显示“statements”表,注意“FROM”和“TO”字段:
“statements”表中的“FROM”和“TO”字段显示每个语句的“tokens”表中的索引。
4.
查找SELECT语句并检查它是否使用“*”
基本上“statements”表将所有命令保存在选定的ABAP程序中,
我们可以通过使用“tokens”表中的FROM / TO字段来访问语句中的每个标记。
要判断语句是否为SELECT,我们只需检查第一个标记即可。
另外通过检查第二个标记,我们可以看到SELECT是否被星号(*)使用。
扫描仪代码的剩余部分如下:

5.
结论
基本上扫描ABAP代码非常简单,但是当您开始编码分析器以检测不同的现象时,真正的困难部分就开始了。上面的示例仅扫描一种类型的命令(SELECT),它与代码中的任何其他命令无关。
让我们设想一个扫描器在LOOP下检测SELECT命令,
并且不要忘记SELECT可以在子程序调用下进行,如PERFORM,METHOD调用或MACRO调用。
要检测复杂状态,需要更详细的类,逻辑和偏离测试用例。
我之后也会尝试写一篇关于建模这样复杂类的文章。
谢谢阅读!
BULENT BALCI
- End -
原文地址:https://blogs.sap.com/2019/04/22/how-to-scan-abap-code/
原文作者:Bulent Balci