llvm, clang 和 scan-build 的安裝和使用


1 使用 clang 編譯

1.1 簡單使用 clang 編譯

clang 的 選項是 和 gcc 兼容的。所以最簡單的用法就是:

clang main.c

1.2 在 Makefile 中使用 clang 編譯。

使用 $(CC) 或者 $(CXX) 可以通過 環境變量來選擇 編譯器。
這樣可以方便的指定編譯器。

1.2.1 設置 main.c 內容:

用於測試 的 C 程序。

#include <stdio.h>
int main(int argc, char **argv) {

	int i;
	i = 10;
	printf("%d\n", i);

	return 0;
}

1.2.2 設置 Makefile 內容:

注意:

  • Makefile 中,不用要 指定 CC 的具體實現。也就是說不要使用包含 CC=gcc, CC:=gcc 等的指令。
all:
	$(CC) main.c

1.2.3 設置 環境變量,指定編譯器:

  1. 不設置 CC。默認使用 cc 也就是 gcc:
# compiling with cc (gcc)
unset CC
unset CXX
make 
>	cc main.c
  1. 設置 CC=gcc。使用 gcc:
# compiling with gcc
export CC=gcc
export CXX=g++
make 
>	gcc main.c
  1. 設置 CC=clang。使用 clang:
# compiling with clang
export CC=clang
export CXX=clang++
make 
>	clang main.c

2 安裝 scan-build

scan-build 是用於靜態分析代碼的工具。
它包含在 clang 的源碼包中。

注意:

  • scan-build 的版本要和 clang 的一致。
  • scan-build 在 git 上有 python 版本。但是不能使用。

安裝指令:

# download llvm.x86_64  3.4.2-8.el7 的源碼可以通過以下鏈接下載。
# 但是在這裏,對於 scan-build 不是必要的。
# wget http://releases.llvm.org/3.4.2/llvm-3.4.2.src.tar.gz

# dowanload clang-devel.x86_64 
# 源碼包中包含 scan-build
wget http://releases.llvm.org/3.4.2/cfe-3.4.2.src.tar.gz

# unzip clang source codes
unzip xvf cfe-3.4.2.src.tar.gz
# copy scan-build and related to /usr/local/bin
cd cfe-3.4.2.src/tools/scan-build
cp /* /usr/local/bin

3 使用 scan-build

簡單的使用:
只需要 在 make 之前加上 scan-build 就可以了。

scan-build --use-analyzer `which clang` make

注意:

  • scan-build 需要指定 clang 的路徑。所以需要設置 --use-analyzer
  • 使用 -o 選項,可以指定輸出報告的存放位置。默認是 /tmp 目錄下。

3.1 設置 main.c 內容:

用於測試 的 C 程序。特意少寫了返回碼。

#include <stdio.h>

int main(int argc, char **argv) {

	int i;
	i = 10;
	printf("%s\n", i);

	return ;


}

3.2 運行 scan-build:

scan-build 發現了 1 個錯誤:

scan-build --use-analyzer `which clang` make
>	scan-build: Using '/usr/bin/clang' for static analysis
>	/usr/local/bin/ccc-analyzer main.c
>	main.c:9:2: error: non-void function 'main' should return a value [-Wreturn-type]
>	        return ;
>	        ^
>	1 error generated.
>	scan-build: 0 bugs found.
>	scan-build: The analyzer encountered problems on some source files.
>	scan-build: Preprocessed versions of these sources were deposited in '/tmp/scan-build-2019-08-17-163932-29084-1/failures'.
>	scan-build: Please consider submitting a bug report using these files:
>	scan-build:   http://clang-analyzer.llvm.org/filing_bugs.html

3.3 查看錯誤報告:

具體的錯誤報告可以在 /tmp/scan-build-2019-08-17-163932-29084-1/failures 查看。
它是 html 的。十分的方便查看。

4. scan-build 的掃描結果

以下是對一個實際項目,使用 scan-build 的掃描結果:
從中可以看到:

  • scan-build 支持豐富的錯誤類型掃描。(包括 內存泄漏 )
  • Bug Summmary 列表中,對錯誤類型進行了分類彙總。
  • Reports 列表中,指出了錯誤的出處。點擊 view report 可以查看詳細的源碼和錯誤分析。
    在這裏插入圖片描述在這裏插入圖片描述

5. references:

premake 使用clang替換gcc
scan-build: 從命令行運行分析器

6. PS:

scan-build 可以用於交叉編譯中。請查看:
使用 Clang 進行靜態代碼檢測

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章