本科 实验室工作记录
这部分是对我实验室工作
的记录和总结
。
总览
我是大二下四月份进入的实验室,跟随学长负责的是网络模块的部分,我自己完成了对于IP
地址的封装,完成了LHostAddress
类(虽然他们两个最后没用我的代码,可能是懒得做修改和适配吧),供他们两个调用,在这个过程我学到了大型项目的编译方法,我们的项目sdk
部分采用的是cmake
编译链接的方式,非常好用,使用第三方软件conan
进行第三方包的管理,在Linux
平台下(也是我想要就业的平台方向)进行构建编译。暑假学长走后,针对代码过程出现的bug
进行了修复,9月初结束了sdk
部分的开发,现在转向了安全代码扫描部分的开发。
安全代码扫描部分,我们需要用开源项目llvm
编译生成的clang-tidy
可执行文件去扫描代码中的规范问题并提出警告,首先这涉及到的是clang
编译器,我没用过,但是这个问题倒不是很大;第二是这个东西涉及到编译原理中的抽象语法树,这个东西我没学过,所以有点难,还好老师给我分配的任务是中低优先级,到目前为止还好。关于工作中的细节问题我放在下面了。
注意:下面由于我配置了ccache
(这玩意用起来是真爽我操),编译器版本写"g++"
和"gcc"
,不能让他直接调用我们安装的gcc
,g++
,要走ccache
这一步哈,并且对于公司这边,记得gcc
和g++
一定要切为gcc-9
(当然我没事也不会切)…
Larksdk工作内容
我主要负责的是网络模块后续的处理,目前我一个人感觉能够处理,基本到收尾阶段了。
cmake构建
第一次按照下面的cmake
操作,后面就只用 cmake ..
就可以了
1 | conan install .. |
现在需要激活GoogleTest
单元测试,激活构建目标tests
,可以用如下:
1 | cmake -DCMAKE_C_COMPILER="gcc" -DCMAKE_CXX_COMPILER="g++" -DENABLE_GTEST=ON .. |
如果显示doxygen
相关的错误,那么记得安装;可能也需要安装一下graphviz
1 | sudo apt install doxygen graphviz |
2024/1/22 更新
在公司我的办公电脑上我安装的是Ubuntu
虚拟机,上述在Wsl
上的步骤可能不太适应原生的Ubuntu
系统,所以可能编译会报错
我总结了一下,使用如下流程,前提是配置好了ccache
,总结好下面的原因就是为了兼容ccache
和vscode
当中的CMake tools
,注意cmake
后面是两个点
1 | conan install .. |
第一次cmake
的时候,选择的编译器如下:
第二次的时候如下:
如果是这样,就表明配置成功了,在vscode
的CMake Tools
插件当中只能找到gcc
和g++
,虽然我们在配置ccache
的时候做了软链接的映射,但是还是会出现各种问题,这样的流程可以有效的做到避免
然后进行make
即可
单元测试和覆盖率检测
googletest
版本使用1.12.1
,去github
下载源码进行编译安装gcovr
版本使用5.1
,使用pip
安装
本地运行单元测试,并且生成覆盖率报告,按照上面进行单元测试,在测试过程中,覆盖率数据将会被自动收集,然后我们通过gcovr
工具生成这份报告,如下:
1 | # 安装gcovr |
后续
网络模块测试完毕啦,问题也全部解决,剩下的12
月就在实验室复习,然后考完试就去上班!啦啦啦啦啦啦!~~~
安全代码扫描工作内容
LarkScanner
LarkScanner
是已经写好的脚本,执行这个脚本可以执行国军标的检测文件clang-tidy
clang-tidy/src/gjb8114
目录下的规则文件的编写:一个头文件.h,一个源文件.cpp
,以表格中的序号命名编写完成之后,需要在
gjb/samples
目录下编写对应的两个源文件,一个是遵守规则的,一个是不遵守规则的,还是以序号命名,如果扫描出来之后遵守规则没有扫到然后不遵守规则的扫到了,那么就算成功编译命令
1
2
3conan install .. //只用拉一次
cmake -DPACKAGE_VERSION=1.0.1 -DCMAKE_C_COMPILER="gcc" -DCMAKE_CXX_COMPILER="g++" ..
makemake
完毕之后在build/bin
目录下生成可执行文件larkscan
然后我们需要跑程序来检测
samples
目录下的各个程序1
ctest -VV
或者我们直接调用可执行程序
larkscan
来扫描样本目录的程序(我的第一个不行,只能用第二个目前)1
2// 现在我们在build目录
./bin/larkscan ../gjb/我们需要把自己编译的规则拿到
llvm
工程当中去编译,见第二条,这样生成的新文件就包含了我们写的规则了,然后把生成的clang-tidy
在我们的项目中clang-tidy/bin
目录下替换掉,然后再把clang-tidy/bin
和clang-tidy/lib
目录再次拷贝到/opt/LarkStudio5/LarkScanner
1 | cd /opt/LarkStudio5/LarkScanner |
国军标规则编写
国军标规则编写的流程
注意,用官方的
llvm
工程它本身是不包含我们自己的模块的,想要编译我们自己的模块需要添加一些东西,见gitlab
:包含完之后就可以编译,然后注意每次加入新的规则都要将对应的先加入到
Gjb8114TidyModule.cpp
中和CMakeLists.txt
(现在不需要)需要编写新的规则的时候,是有样本文件供我们参考的,现在工程中已经把所有的模板文件创建好了,所以不需要
1
2
3
4
5sudo apt install python-is-python2 #只安装一次python2,用python3会出问题
cd llvm-project/clang-tools-extra/clang-tidy #进入到这个目录
python2 add_new_check.py gjb8114 r_x_y_z #对应规则R-x-y-z,尽量一次写对,不然不好删除然后进行规则编写,然后进行自测
拉取代码覆盖
llvm
工程下的文件1
2# 注意自己写的部分需要提前备份,否则给你替换掉了,这一点要尤其注意!!!
cp /home/lzx0626/DavidingPlus/Lark5/larkscanner/clang-tidy/src/gjb8114 /home/lzx0626/DavidingPlus/Lark5/llvm-project/clang-tools-extra/clang-tidy/ -rllvm
工程的编译记得使用
gcc-9
,不要乱切gcc
版本,因为这样很容易导致代码的重新编译!!!编译完成后
build/bin/clang-tidy
目录下的文件就是我们需要的,按照前面说的进行拷贝1
2
3
4
5
6
7
8
9
10# 跑之前gcc版本最好切为gcc-9,虽然我下面也设置了!!!!!
cd llvm-project
mkdir build #如果不存在
cd build
cmake -DCMAKE_C_COMPILER=/usr/bin/gcc-9 -DCMAKE_CXX_COMPILER=/usr/bin/g++-9 -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE=Release -G "Unix Makefiles" ../llvm
# 我的电脑是6核,量力而为
make -j 4上传
使用clang-tidy
其中修复功能我们不需要管,注意有两个clang-tidy
,一个是通过apt管理下载的官方的clang-tidy
,另外一个是我们通过llvm
工程添加了测试模块之后的自己的clang-tidy
,这两个需要注意,我们自己的就在目录下./clang-tidy
就好了,注意两个不要搞混了
抽象语法树
查看抽象语法树
1 | clang -c -Xclang -ast-dump test.cpp # test.cpp就是需要查看的cpp文件 |
结果示例:
对象树匹配网站
AST Matcher Reference (llvm.org)
clang-query
使用示例
目前写了的条数记录
1 | # A_1_5_1 R_1_6_12 R_1_5_2 R_1_6_5 R_1_7_8 R-1-6-8 |
进程记录
1 | A-1-5-1:自测完成(已上传,等待反馈) |
后续
马上就期末复习了,这部分交给一位研究生学长做了,所以后续内容不再更新…