Windows 環境下,CodeQL 安裝教程


其實吧,這玩意,網上教程特別多,但是都有問題,

很多細節說得不清不楚,結果按照教程根本無法完整地安裝上,

所以,這里還是重新整理一下 CodeQL 的安裝過程。

 

1:

下載 CodeQL ,地址:https://github.com/github/codeql-cli-binaries

cli,地址,我下載的是當前時刻的最新版:https://github.com/github/codeql-cli-binaries/releases/download/v2.8.4/codeql-win64.zip

 

2:

下載 CodeQL ,支持庫,地址:https://github.com/github/codeql

直接下載就好了

 

其實,做完以上兩步,就可以用了,但是。。。

這個配置,會玩死你。。。

這里先說配置,后面缺東西,再加

 

配置,先把 codeql-cli 解包,隨便放在哪里,可以改名就叫 codeql-cli

再把 CodeQL 支持庫解壓,隨便放在哪里,可以改名叫 codeql-home

比如,放在同一個目錄下

 

 

 

兩個目錄均加入環境變量

加用戶變量就好,不用加系統變量,比如這樣

 

 

 

然后打開個cmd,看一下效果,

 

 

還是有效果的

 

好了,正常情況下,如果想使用IDE的話,還得弄個VSCode,這個不算插曲,如果想用,就搞,不想用就算了,

這里還是搞一個吧,有界面總比看黑框框強。

 

當前最新版 vscode

https://az764295.vo.msecnd.net/stable/c722ca6c7eed3d7987c0d5c3df5c45f6b15e77d1/VSCode-win32-x64-1.65.2.zip

下載了之后,直接解壓,直接能用,

然后,去vscode里面安裝 codeql 插件,這些都很傻瓜,安裝方法,別的各種亂七八糟教程上也都有,

最后,配置路徑

 

 

前面設置了環境變量,這里其實可以不設置的,但是,還是設置吧,重要的位置就這一個。

 

以上全都設置完,正常的套路也就結束了,

 

其他教程開始說,需要創建一個數據庫了。

 

codeql 是類似要創建數據庫的,然后再在數據庫里面查數據的,

這些也都沒啥,一般來說,別的教程都會說,這時候用這么個命令,創建數據庫,就完了

codeql database create cpptest -l=cpp

對,就完了。

很多教程里面並沒有說,敲這條命令的前提條件。

這里我說清楚吧。

 

首先,codeql 創建數據庫,實際上是要編譯一次程序的,實際上是還有個參數 -c 來控制編譯的。

如果沒有輸入這個參數,也會編譯,但是在 Windows 環境下,編譯 C++ 程序,大多會失敗,

且提示亂七八糟,亂碼滿屏飛,中文是完全都不支持吧,可能是utf-8編碼的。

 

所以,如果要順利創建一個數據庫,需要傳入一個 -c 參數來做編譯操作。就變成了這樣

1 codeql database create cpptest -l=cpp -c=“”

 

然后就是下一個問題,怎么編譯,常規方式必然無法處理,

一般來說,Windows上編譯軟件,大多都是使用VS 系列,比如我這邊, vs 從 6 到 2022 全都有。

第二個編譯方法,可能少部分人會使用 mingw 安裝 gcc 來編譯代碼,也沒問題,

第三個編譯的方法,極少數人可能會用 llvm + clang 來做編譯,這個,我本地也有。

(其實最后我選擇了方法3,因為1不行,2我又不想裝,繼續)。

 

OK了,那就一個一個來吧,正常來說,我們用VS來寫代碼,那么就用vs來編譯吧,我還記得有個東西叫 devenv ,能直接編譯整個項目,我好聰明,來吧,

先寫個devenv 編譯的命令吧,其實很簡單:

1 devenv VSTest006.vcxproj /rebuild "Release" /Project VSTest006 /ProjectConfig "Release|Win32"

很容易吧,rebuild一個項目,然后build win32版, release 程序,一切都那么完美,這條命令是可以執行的(需要有vs2019 命令行環境),

然后第一條編譯命令出現了,

1 codeql database create cpptest -l=cpp -c="devenv VSTest006.vcxproj /rebuild \"Release\" /Project VSTest006 /ProjectConfig \"Release|Win32\"" --overwrite 

看着沒啥問題,很完美,但是執行的時候,就瘋了

 

 

什么破逼玩意。

行吧,這么搞,搞不定,那就來個曲線救國,

我把編譯命令寫個批處理,然年后調用批處理來編譯,總可以吧。

1 codeql database create cpptest -l=cpp -c="build.bat" --overwrite

我很高興地再重新創建數據庫,

亂碼出現了,不要緊,但是問題怎么解決啊,實際上。。。

 

 

可能codeql 工具鏈里面有個東西調用了這玩意,尷尬,咋整。批處理也不能用了,

還有最后一種方法,就是走自己動手老路,cl 一個一個編譯文件,其實,我不想這么干,因為,如果我用cl 這么干的話,后續鏈接也需要我自己來鏈,太坑了。

 

至此 vs 系列,放棄,

我電腦中沒有安裝mingw,所以直接放棄

 

但是,我之前用過llvm,我這里還有llvm,所以,可以用llvm的工具 clang 來做相關的事情,試試看。

命令就變成了這樣

1 codeql database create cpptest -l=cpp -c="clang VSTest006.cpp" --overwrite

成了

 

 

推斷 -c 命令還支持 makefile 或者 cmake 之類的,這里是我懶得查,所以放棄了,先趟道,再深究。

 

數據庫有了,然后就是查詢了

 

查詢怎么辦,好辦,

寫段查詢代碼,就查了,比如,我查個函數吧

 1 /**
 2  * @name Nemesis
 3  * @kind problem
 4  * @id Zoo
 5 */
 6 
 7 import cpp
 8 
 9 
10 from Function f
11 select f, f.getName()

打印函數名

 

正常查詢、打印的命令是這樣的

 

 

結果是這樣的

 

 

效果還不錯,8行第五個。

但是一般來說,第一次玩的時候,查詢都是這樣的結果

 

 

看說明說,需要有個 qlpack.yml ,然后開始google吧,運氣好的話,10~30分鍾后,問題可以解決,

運氣不好,就看臉了,

 

強調一下很難么?還是我的臉就黑,我看的那些教程全部都是扯蛋的,全部都沒說把它放在指定位置 ,

沒人會說,這個代碼,必須是放在 codeql 的庫里面的,否則 第一行 import cpp 都import 不到,

 

一切都結束,命令行版就解決了,

非命令行版怎么辦呢。

 

命令行版處理完了,UI版其實更簡單了。OK,收工,

 

 

夜里餓了,中間炒了個飯,又燉了個湯

 

個人感覺,這玩意,其實和重構工具類似,都是通過AST樹來分析各個元素,然后獲取相關的各種信息,加以展示。

可能對那種解釋性語言,它算式一個很有用的東西,

對編譯性語言來說,它的用途,感覺有限,因為和他功能相近或類似的東西其實不少。

最近的,比如,VAX。。。代碼整體重構,不但能各種查還能各種改,只是無法定位參數等信息,但是不重要,因為如果代碼整潔規范的話,參數查的時候就找到了

 

 

其實,針對 devenv無法被codeql調用的情況,微軟給了一個例子

C:\codeql-home\codeql\codeql.cmd database create -l=cpp -s=C:\codeql-home\drivers\kmdf -c "msbuild /t:rebuild "C:\codeql-home\drivers\kmdf\kmdfecho.sln" /p:UseSharedCompilation=false" "C:\codeql-home\databases\kmdf" -j 0

需要直接用msbuild,

命令稍作修改,就可以編譯了

1 codeql.cmd database create -l=cpp -c "msbuild /t:rebuild \"E:\Code\visual studio 2019\VsTest001\VsTest001\VSTest006\VSTest006.vcxproj\" /p:UseSharedCompilation=false" msbuilds -j 0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM