优秀的编程知识分享平台

网站首页 > 技术文章 正文

推荐一款超 Geek 的代码搜索工具(可以搜索代码的网站)

nanyue 2024-09-09 04:52:41 技术文章 8 ℃

关注公众号 “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。它将在我们的代码中找到比较的左侧和右侧相同表达式的所有位置:

nbsp;semgrep --lang python --pattern '$X == $X' test.py
test.py
3:        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 main
type 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,得到如下的提示:

是不是很强大?感觉试试吧。


今天的项目大家觉得怎么样吗?如果你喜欢,请在文章底部留言、点赞或关注转发,你的支持就是我持续更新的最大动力!

Tags:

最近发表
标签列表