程式碼檢查過程中為什麼需要涉及到編譯呢?

華為雲開發者聯盟發表於2023-09-27

本文分享自華為雲社群 《程式碼檢查過程中為什麼需要涉及到編譯呢?》,作者:gentle_zhou。

隨著大家對軟體安全越來越重視,在編碼階段針對原始碼安全的保障也被各行各業企業研發測試運維團隊與個人開發者越來越頻繁的被提及,其中靜態程式碼檢查SAST工具尤為突出。

SAST程式碼檢查服務作為一款可以對原始碼進行質量(包括風格)、安全、規範等方面進行檢查的工具,它可以檢測出程式碼中存在的缺陷與風險。而隨著大家對工具深入的使用,很多小夥伴在使用過程中產生了困惑,不是說好只針對原始碼進行檢查嗎?為什麼還會涉及編譯?為什麼在我本地編譯成功,放到雲端環境就說編譯失敗了呢?

本文嘗試針對上述這些問題一一進行解釋,讓小夥伴們瞭解清楚其中的過程與原理。

1、不是說好只針對原始碼進行檢查嗎?為什麼還會涉及編譯?

一般來說是的,SAST靜態程式碼檢查是一種靜態應用程式安全測試技術,通常是在程式碼編譯之前進行的;也就是說,SAST工具並不是強制需要執行或執行程式碼才可以使用,針對原始碼本身就可以去分析程式碼的語法、結構、邏輯等。

但是,這並不意味著SAST工具就與編譯無關了;事實上,SAST工具在必要的時候,也需要藉助編譯構建工具來將程式碼編譯之後,對生成的編譯產物進行分析,可以對程式碼的語義和邏輯有更深入的理解和分析。

2、編譯的大概過程是怎麼樣的?

在講編譯的過程前,讓我們先了解幾個專有名詞。

AST,Abstract Syntax Tree 抽象語法樹,是一種用來表示程式程式碼結構的樹形資料結構,它可以反映出程式碼的語法和邏輯。AST可以應用在語法檢查、程式碼風格檢查、格式化程式碼、語法高亮、錯誤提示、自動補全等方面。

cke_114.png

IR,Intermediate Representation 中間表示,是一種用來表示程式程式碼語義的資料結構,它可以把不同程式語言的程式碼轉換為一種通用的形式,方便進行分析和最佳化。

cke_115.png

CFG,Control Flow Graph 控制流圖,是一種用來表示程式程式碼執行流程的圖形資料結構,它可以把程式碼分割為基本塊,並用邊表示基本塊之間的跳轉關係。

cke_116.png

上述3個技術側專有名詞,在程式碼檢查過程中,起到了讓工具可以更好地理解和處理程式碼的語義和邏輯的作用,幫助提高分析的準確性。

我們言歸正傳,那在SAST程式碼檢查工具的編譯過程中,都會經歷哪些過程呢?一般來說,完整的編譯過程會經歷:對原始碼進行語法、詞法、語義的分析,生成AST,接著轉換為IR,生成CFG,對資料流進行分析、最佳化,生成目的碼。

因此,SAST程式碼檢查並不是完全脫離編譯,在一定程度上是需要依賴於編譯構建工具來輔助深度分析的。

3、為什麼在我本地編譯成功,放到雲端環境就編譯失敗了呢?

到此,相信大部分小夥伴會對在SAST工具中採用了編譯操作表示理解,但是我相信在使用過程中依然會有掃描不成功的場景,其中最典型的必然就是小標題裡這個問題了:為什麼在我本地編譯成功,放到雲端環境檢查期間就說編譯失敗了呢?

具體來看,大致有以下幾種原因:

  • 最常見的是,在本地環境中,專案中引用了一些存放在本地的私有依賴活配置。而在雲端環境,在SAST編譯過程中,找不到這些依賴或配置,編譯也就失敗了。
  • 使用者的這個工程專案本身就不是編譯類專案 或則 這個專案雖然是編譯類專案但在專案中沒有做好正確配置。比如經常碰到的問題就是使用者剛接手某個專案,得到的資訊這就是個編譯類專案,但其實在專案中並未含有核心配置檔案,比如maven專案中缺少了核心配置檔案pom.xml。
  • 雲端SAST工具中的檢查編譯引數沒有選擇正確。比如使用者的工程是個Maven專案,但使用者錯誤以為這是gradle專案,在雲端選取了gradle作為編譯工具。又比如在C#專案中,針對msbuild編譯工程,.net框架選錯了版本(3.5選成了4.8)。
  • 使用者的專案程式碼中有一些語法錯誤或型別錯誤(比如拼寫錯誤、缺少分號、型別不匹配等),在本地環境中,IDE幫助自動修正或則本地編譯器沒有檢查出來。而云端SAST工具中採用了更嚴格或更高階別的編譯器,導致編譯不透過。
  • 使用者的工程中有一些特殊的語言特性或語法糖,例如Lambda表示式、列表推導等,本地編譯器支援這些特性;而云端SAST工具使用了不支援這些特性的編譯器或較低的語言版本,導致編譯不透過。

當然,不同的SAST工具會採用不同的掃描方法和技術,因此也有著不同的編譯方式和對編譯環境深淺不一的依賴程度。

參考資料

1、https://en.wikipedia.org/wiki/Abstract_syntax_tree

2、https://www.twilio.com/blog/abstract-syntax-trees

3、https://www.cs.princeton.edu/courses/archive/spr03/cs320/notes/IR-trans1.pdf

4、https://gcc.gnu.org/onlinedocs/gccint/Control-Flow.html#:~:text=A control flow graph (CFG) is a data,behavior of a function that is being compiled.

5、https://www.csl.cornell.edu/~zhiruz/5997/pdf/lecture04.pdf

 

點選關注,第一時間瞭解華為雲新鮮技術~

 

相關文章