网站首页 > 技术文章 正文
关注公众号 “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,得到如下的提示:
是不是很强大?感觉试试吧。
今天的项目大家觉得怎么样吗?如果你喜欢,请在文章底部留言、点赞或关注转发,你的支持就是我持续更新的最大动力!
猜你喜欢
- 2024-09-09 序列化 Python 对象(序列化对象需要实现的接口)
- 2024-09-09 一篇文章读懂系列-2.二叉树及常见面试题
- 2024-09-09 Meta 如何将缓存一致性提高到 99.99999999
- 2024-09-09 自学Python笔记2(python0基础自学书)
- 2024-09-09 找到两个链表的第一个公共节点(找出两个链表的第一个公共节点)
- 2024-09-09 详解SkipList跳跃链表(跳表遍历)
- 2024-09-09 Python画豪华版圣诞树,带漂亮彩灯与文字背景
- 2024-09-09 零基础Python完全自学教程23:函数的返回值、作用域和匿名函数
- 2024-09-09 redis的内存满了之后,redis如何回收内存
- 2024-09-09 「python小游戏」据说这是一款还原度超高的小游戏,你感受下....
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)