其實吧,這玩意,網上教程特別多,但是都有問題,
很多細節說得不清不楚,結果按照教程根本無法完整地安裝上,
所以,這里還是重新整理一下 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