測試代碼
先寫個簡單的代碼
main.c
#include
#include
#include
int main(int argc, char *argv[])
{
char *tmp = (char *)malloc(argc);
if(tmp)
{
strncpy(tmp, argv[0], argc);
printf("%s", tmp);
if(argc > 2)
{
free(tmp);
}
}
printf("hello world!n");
return 0;
}
使用clang-tidy分析一下
apt install -y clang-tidy
clang-tidy main.c
Error while trying to load a compilation database:
Could not auto-detect compilation database for file "main.c"
No compilation database found in /work/analyzer or any parent directory
fixed-compilation-database: Error while opening fixed database: No such file or directory
json-compilation-database: Error while opening JSON database: No such file or directory
Running without flags.
2 warnings generated.
/work/analyzer/main.c:12:3: warning: Call to function 'strncpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'strncpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
strncpy(tmp, argv[0], argc);
^~~~~~~
/work/analyzer/main.c:12:3: note: Call to function 'strncpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'strncpy_s' in case of C11
strncpy(tmp, argv[0], argc);
^~~~~~~
/work/analyzer/main.c:21:2: warning: Potential leak of memory pointed to by 'tmp' [clang-analyzer-unix.Malloc]
printf("hello world!n");
^
/work/analyzer/main.c:8:22: note: Memory is allocated
char *tmp = (char *)malloc(argc);
^~~~~~~~~~~~
/work/analyzer/main.c:10:5: note: Assuming 'tmp' is non-null
if(tmp)
^~~
/work/analyzer/main.c:10:2: note: Taking true branch
if(tmp)
^
/work/analyzer/main.c:15:6: note: Assuming 'argc' is <= 2
if(argc > 2)
^~~~~~~~
/work/analyzer/main.c:15:3: note: Taking false branch
if(argc > 2)
^
/work/analyzer/main.c:21:2: note: Potential leak of memory pointed to by 'tmp'
printf("hello world!n");
^
compile_commands.json
還是有點(diǎn)用的,但我們RT-Thread項(xiàng)目中代碼那么多,一個一個輸入太麻煩了。
而且我們代碼多是arm和gcc的,而開發(fā)機(jī)多是x86,clang默認(rèn)參數(shù)也分析不了。
剛才分析結(jié)果第1行就有提示,沒有找到compilation database,其實(shí)scons就可以生成
需要比較新的版本
python3 -m pip install scons
python3 -m SCons -v
SCons by Steven Knight et al.:
SCons: v4.0.1.c289977f8b34786ab6c334311e232886da7e8df1, 2020-07-17 01:50:03, by bdbaddog on ProDog2020
SCons path: ['/usr/lib/python3/dist-packages/SCons']
Copyright (c) 2001 - 2020 The SCons Foundation
然后更新下Scons腳本,讓生成compile_commands.json
git diff SConstruct
+env.Tool('compilation_db')
+env.CompilationDatabase()
make a building
DoBuilding(TARGET, objs)
run-clang-tidy
然后使用 run-clang-tidy 就可以自動分析所有的源代碼了。
輸出html
生成的結(jié)果是文本,查看起來還是比較費(fèi)力的,目前有個簡單的轉(zhuǎn)換為html格式,
雖然也比較簡陋,但比文本還是方便多了。
run-clang-tidy > clang_tidy_analyzer.txt
pip3 install clang-html
clang-tidy-html clang_tidy_analyzer.txt
電子發(fā)燒友App









































評論