Semgrep:针对多种语言的轻量级静态分析

2020-07-23 02:13:48

Semgrep是一款用于轻松检测和防止代码库中的错误和反模式的工具。它结合了grep的便利性和语法和语义搜索的正确性。开发人员、DevOps工程师和安全工程师使用Semgrep自信地编写代码。

下面是一个简单的Python示例test.py。我们希望按ID检索对象:

Def get_node(node_id,Nodes):对于节点中的节点:如果node.id==node.id:#Oops,应该是';node_id';返回node返回NONE。

这是个窃听器。让我们使用semgrep来查找类似的错误,使用一个简单的搜索模式:$X==$X。它将查找代码中左右比较表达式相同的所有位置:

$docker run--rm-v";${pwd}:/HOME/repo";rereturn tocorp/semgrep--lang python--pattern';$X==$X';test.pytest.pyrule:python.deadcode.eqeq-is-bad:无用比较操作`node.id==node.id`或`node.id!=node.id`.3:if node.id==node.id:#Oops,应该是';node_id&#。

对于简单模式,请使用--lang和--pattern标志。此操作模式对于快速迭代单个文件或文件夹上的模式非常有用:

对于高级配置,请使用--config标志。此标志自动处理多种输入配置类型:

如果没有此标志,将从.sgrep.ymor多个匹配.sgrep/**/*.yml的文件加载默认配置。

像$X、$WIDGET或$USERS_2这样的元变量。元变量名称只能包含大写字符、_或数字,并且必须以大写字符开头,或者$x或$SOME_VALUE等_-名称无效。元变量用于跟踪特定代码段中的变量。

那个..。(省略号)运算符。省略运算符将序列抽象出来,因此您不必费力考虑特定代码模式的细节。

将在代码中找到open()调用的结果赋给变量的所有匹配项。

规则:-id:打开-永不关闭的模式:-Pattern:$FILE=OPEN(...)-Pattern-Not-Inside:|$FILE=OPEN(...)...$FILE.Close()消息:";打开的文件对象没有相应的关闭";语言:[Python]严重性:错误。

此规则查找已打开但从未关闭的文件。它通过寻找开放的空间(...)来实现这一点。模式,而不是后面的Close()模式。$FILE元变量确保在打开和关闭调用中使用相同的变量名。省略运算符允许将任何参数传递给open,并允许在open和close调用之间传递任何代码语句序列。我们不关心如何调用Open,或者在Close调用之前发生了什么,我们只需要确保调用了Close。

等价是Semgrep中的另一个关键概念。Semgrep自动搜索语义等价的代码。例如,以下模式在语义上是等价的。

如上所述,您还可以将注册表名指定为配置。R2c提供了一个配置文件注册表。这些规则已经使用我们的分析平台在数千个存储库上进行了调整。

Semgrep是一个名为pfff的大型程序分析库的前端,在那里它被命名为sgrep。Pfff开始于facebook,并且是开源的,但现在已经存档,主要的维护者在r2c工作。

对完全支持的托管版本Semgrep感兴趣吗?放下你的电子邮件,我们会通知你的!