关注公众号 “OpenSourceDaily” ,每天推荐给你优秀开源项目
大家好,我是欧盆索思(opensource),每天为你带来优秀的开源项目!
程序员日常工作离不开搜索工具,虽然各种编辑器都会带查找功能,但很多程序员,特别是那些 Geek 程序员,都喜欢 grep 这样的命令行工具:灵活、强大,还可以装逼!今天推荐一款类似 grep,但可以识别代码语法、语义并支持多语言的代码搜索工具,装逼神器,有木有?!
名称:Semgrep,项目地址:https://github.com/returntocorp/semgrep,Star 数 500。
Semgrep 是一种很容易检测和防止代码库中的 bug 和反模式的工具。它结合了 grep 的便利性和语法和语义搜索的正确性。开发人员,DevOps 工程师和安全工程师使用 semgrep 可以更加自信地编写代码。
目前该工具支持的语言有:Python、JavaScript、Go、Java、C,即将支持 TypeScript、PHP。
安装
Mac 下,通过 Homebrew 安装:
brew install returntocorp/semgrep/semgrep
Ubuntu 下,通过发布的脚本安装 https://github.com/returntocorp/semgrep/releases/download/v0.7.0/semgrep-v0.7.0-ubuntu-generic.sh
./semgrep-v0.7.0-ubuntu-generic.sh
当然,你也可以通过 Docker 快速试用它:
docker run --rm -v "${PWD}:/home/repo" returntocorp/semgrep --help
使用
这里有一个 Python 使用示例:test.py,我们想通过 ID 检索对象:
def get_node(node_id, nodes): for node in nodes: if node.id == node.id: # Oops, supposed to be 'node_id' return node return None
很显然,我们故意弄了一个 bug。让我们使用 semgrep 通过简单的搜索模式查找类似的错误:$X == $X。它将在我们的代码中找到比较的左侧和右侧相同表达式的所有位置:
$ semgrep --lang python --pattern '$X == $X' test.pytest.py3: if node.id == node.id: # Oops, supposed to be 'node_id'
模式举例
该工具有很多模式规则,这里举一些例子:
PatternMatches$X == $Xif (node.id == node.id): ...requests.get(..., verify=False, ...)requests.get(url, timeout=3, verify=False)os.system(...)from os import system; system('echo semgrep')$ELEMENT.innerHTMLel.innerHTML = "";$TOKEN.SignedString([]byte("..."))ss, err := token.SignedString([]byte("HARDCODED KEY"))
这里有更多关于规则的说明:https://github.com/returntocorp/semgrep-rules。
在线使用
此外还提供了在线版本,地址:https://semgrep.live/,除了输入代码,还支持登录 GitHub,扫描特定的代码仓库。基于在线的工具,类似上面 Python 的例子,提供一个 Go 的示例,代码如下:
package maintype Node struct { ID int Name string}func main() { }func getNode(nodeID int, nodes []*Node) *Node { for _, node := range nodes { if node.ID == node.ID { return node } } return nil}
输入模式:$X == $X,点击:Run,得到如下的提示:
![d14aeacf14564d216fcb39ca34dfd2b4.png](https://i-blog.csdnimg.cn/blog_migrate/895f3231cb8fb9446522451652fd9781.jpeg)
是不是很强大?感觉试试吧。
今天的项目大家觉得怎么样吗?如果你喜欢,请在文章底部留言、点赞或关注转发,你的支持就是我持续更新的最大动力!