使用 ast-grep 精準匹配指定類的方法調用(以 Java 為例)

使用 ast-grep 精準匹配指定類的方法調用(以 Java 為例)

在代碼重構、安全審計或靜態分析的場景中,我們常常需要匹配某個特定類中定義的方法調用。而 ast-grep 作為一款基于語法樹的代碼搜索工具,提供了強大的模式匹配功能,可以幫助我們高效實現這一目標。

本文將以 Java 為例,介紹如何使用 ast-grep 匹配一個給定類的實例所調用的特定方法。我們的問題是:如何只匹配 Class_A 類型對象上調用的 add() 方法,而不誤匹配其它類的 add() 方法?

問題示例

考慮下面的 Java 代碼片段:

class Class_A {public Class_A(int a, int b) {}public int add() {return this.a + this.b;}
}Class_A aaaa = new Class_A(foo, bar);
Object bbbb = new Object();print(aaaa.add());
bbbb.add();

我們的目標是僅匹配 print(aaaa.add());,而不匹配 bbbb.add();,因為后者并非調用 Class_A 的方法。


ast-grep 基礎規則回顧

在 ast-grep 中,我們可以使用 YAML 編寫規則,對語法結構進行匹配。例如:

rule:pattern: $VARNAME.add()

但這會匹配所有調用 add() 的代碼行,無論對象是哪個類的實例。


加入上下文約束:inside + has

為了解決這個問題,我們需要添加上下文限制:

  • 目標調用必須出現在一個作用域中
  • 該作用域中要有對象是由 Class_A 創建的

完整規則如下:

rule:pattern: $VARNAME.add()inside:pattern: $DBstopBy: endhas:pattern: $TY $VARNAME = new Class_A($$$CARGS)

解釋:

  • pattern: $VARNAME.add():匹配任何調用 add() 方法的表達式,并將調用對象賦值給 $VARNAME
  • inside: pattern: $DB:該調用要出現在某個作用域(例如代碼塊)中
  • has: pattern: $TY $VARNAME = new Class_A(...):這個作用域中,必須有 $VARNAME 是通過 new Class_A(...) 初始化的
  • stopBy: end:防止向上搜索超出當前代碼塊

實際效果

應用該規則后:

  • ? 匹配到:print(aaaa.add());
  • ? 不匹配:bbbb.add();(因為 bbbbObject 類型)

小結與提示

通過 ast-grep 的 YAML 配置語言,我們可以實現復雜的語法結構匹配,而不僅僅是文本替換。

如果你也有類似的需求,比如:

  • 只匹配某個類的構造函數
  • 檢查 API 使用是否符合約定
  • 對某一類實例調用方法進行重構或審計

那么不妨嘗試用 pattern + inside + has 的組合方式,實現精確的匹配。


延伸閱讀

  • 官方文檔:https://ast-grep.github.io/
  • 規則配置指南:https://ast-grep.github.io/guide/rule-config.html

歡迎在評論區分享你對 ast-grep 的使用經驗和問題,一起交流更高效的代碼分析技巧!


想要深入討論?我正在「不寬也不深」和朋友們討論有趣的話題,你?起來吧?
https://t.zsxq.com/oFMwJ

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918109.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Dijkstra?spfa?SPstra?

帶負權的無負環最短路問題 對于一張有負邊權的圖,普通 Dijkstra 就不能用了,比如:正常的 Dijkstra 擴散的節點依次為 1,3,2,41,3,2,41,3,2,4。 這時候可以發現,當點 222 擴散的時候,原本達到點 333 的路徑長度是 111&a…

React函數組件靈魂搭檔:useEffect深度通關指南!

你以為它只是替代componentDidMount?數據抓取、事件綁定、定時清理...?事實上,useEffect才是函數組件的“幕后操控者”!但依賴數組的坑、閉包的陷阱,你真的玩轉了嗎? 告別“能用就行”,今天帶你…

LabVIEW實驗室測試框架

在實驗室測試場景中,選用合適的 LabVIEW 框架能夠極大提升測試效率、優化測試流程并保障測試結果的準確性。介紹幾款常用且功能強大的 LabVIEW 測試框架:?TestStand?框架概述?TestStand 是 NI 公司專為測試系統開發設計的一款測試執行管理框架。它能夠…

Kiro :從“規范”到“實現”的全流程 AI 助手

為什么是 Kiro Kiro 是一款面向“規范驅動開發”(Spec-Driven Development)的 AI 開發助手。與只在“寫代碼”環節輔助不同,Kiro 將“從需求到設計再到實現”的完整鏈路顯性化,把需求、設計、任務分解、代碼與測試、文檔等全部納…

【0基礎PS】PS工具詳解--矩形工具

目錄前言一、矩形工具的基礎認知?二、矩形工具的選項欄詳解?三、矩形工具的繪制技巧?四、矩形工具的實際應用場景?五、常見問題與解決方案?總結前言 在 Photoshop(簡稱 PS)的眾多繪圖工具中,矩形工具是使用率極高的基礎工具之一。無論是…

移動端app專項測試

學習目標:app專項測試知識點,其他知識擴充一、app專項(app怎么測試/app側重點在哪)1.功能:跟前面功能測試一樣(跟需求文檔提取測試點,編寫測試用例)2.安裝1.不同品牌安裝,不同操作系…

Spring Boot 結合 CORS 解決前端跨域問題

Spring Boot 結合 CORS 解決前端跨域問題 1. 背景 在前后端分離的項目中,前端(例如 http://localhost:3000)調用后端接口(例如 http://localhost:8080)時,瀏覽器會因為 同源策略 限制而阻止請求&#xff0c…

GPT-5 發布:微小進步難掩瓶頸,AI 行業或迎冷靜

北京時間 8 月 8 日凌晨,OpenAI 的 GPT-5 在萬眾期待中登場。距離 GPT-4 發布已過去兩年半,然而這場發布會卻未重現 ChatGPT 初現時的驚艷,也沒有 GPT-4 的跨越式升級,更無 o1 發布時的震撼。1 小時 20 分鐘的發布會,充斥著不驚艷的測試數據、與競品難分高下的用例展示,甚…

僵尸進程、孤兒進程、進程優先級、/proc 文件系統、CRC 與網絡溢出問題處理(實戰 + 原理)

僵尸進程 / 孤兒進程:是什么、為什么會出現、如何定位與清理進程優先級:nice/priority、CFS 與實時調度、I/O 優先級、cgroup 限流/proc 文件系統:最常用路徑與診斷手法CRC 校驗:在存儲/網絡里的作用與局限、抓包“校驗錯誤”的常…

GPT-5 不僅是版本升級,它標志著 推理能力的商業化 和 Agent操作系統 的崛起,開啟了 AI革命時代。

GPT-5 不僅是版本升級,它標志著 推理能力的商業化 和 Agent操作系統 的崛起,開啟了 AI革命時代。 核心技術亮點: 商業化推理能力:AI不僅生成文本,還能 自動解決復雜任務,提升工作效率。 Agent操作系統&…

【C#】掌握并發利器:深入理解 .NET 中的 Task.WhenAll

在現代 .NET 應用程序開發中,異步編程(Asynchronous Programming)已成為提升性能、改善響應能力和充分利用多核處理器的關鍵技術。async 和 await 關鍵字極大地簡化了異步代碼的編寫,而 Task 類則是這一模型的核心。在處理多個并發…

微型導軌在半導體制造中有哪些高精密應用場景?

微型導軌在半導體制造中用于晶圓對準和定位系統,確保晶圓在光刻、蝕刻等工藝中精確移動。其高精度、高剛性、低摩擦和緊湊設計等特性,使其成為半導體設備實現微米級運動控制的核心部件。光刻機:在光刻工藝中,微型導軌支撐并引導掩…

全棧:Tomcat 安裝教程

Tomcat 安裝教程 安裝 Tomcat 的步驟因操作系統而異,以下是 Windows、Linux 和 Mac 系統的詳細安裝方法: 一、Windows 系統安裝 Tomcat 下載 Tomcat 訪問 Tomcat 官方網站(http://tomcat.apache.org/),選擇適合的版本…

數據分析——Pandas庫

Pandas是Python生態系統中最強大、最流行的數據分析庫,專為處理結構化數據(如表格和時間序列)而設計。它提供了高效的數據結構和豐富的功能,使得數據清洗、轉換、分析和可視化變得簡單直觀。一、Pandas庫的安裝詳解1. 安裝前的準備…

數據結構-哈希表(散列表)

1.基本概念哈希表(散列表):提高數據的查找效率哈希存儲:將要存儲的數據的關鍵字和存儲位置之間,建立起對應的關系, 這個關系稱之為哈希函數。存儲數據時,通過對應的哈希函數可以將數據映射到指定…

如何在Vue中使用拓撲圖功能

前言 該組件基于 Vue.js 和 AntV G6 構建項目特色功能 1. 豐富的節點圖標支持 本拓撲圖系統的最大特色是支持使用自定義圖片作為節點圖標 2. 智能的力導向布局 系統采用力導向布局算法,能夠自動優化節點位置,避免重疊,形成美觀的網絡拓撲結構…

基于dynamic的Druid 與 HikariCP 連接池集成配置區別

你提供的內容是關于 ??dynamic-datasource-spring-boot-starter?? 的詳細介紹,這是一個非常實用的 ??Spring Boot 多數據源動態切換組件??,適用于需要在單個應用中連接多個數據庫并靈活切換數據源的場景。下面我為你梳理一下該組件的核心信息與使…

算法訓練之棧

???~~~~~~歡迎光臨知星小度博客空間~~~~~~??? ???零星地變得優秀~也能拼湊出星河~??? ???我們一起努力成為更好的自己~??? ???如果這一篇博客對你有幫助~別忘了點贊分享哦~??? ???如果有什么問題可以評論區留言或者私信我哦~??? ??????個人…

OpenAI 最新開源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署詳細教程

OpenAI 最近發布了其首個開源的開放權重模型gpt-oss,這在AI圈引起了巨大的轟動。對于廣大開發者和AI愛好者來說,這意味著我們終于可以在自己的機器上,完全本地化地運行和探索這款強大的模型了。 本教程將一步一步指導你如何在Windows系統上&…

在X86架構Linux中創建虛擬根目錄并下載指定架構(如aarch64)的軟件包(含依賴)

在X86架構Linux中創建虛擬根目錄并下載指定架構(如aarch64)的軟件包(含依賴) 在Linux系統中,有時候我們需要在特定的環境或架構下安裝軟件包,而不影響主系統。一種常見的方法是創建一個虛擬的根目錄,并在此環境中操作。本文將介紹如何通過創建…