如何扫描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

 

posted @ 2019-11-01 16:01  不渡之人  阅读(1029)  评论(0)    收藏  举报