实验室工作记录

这部分是对我实验室工作记录和总结

总览

我是大二下四月份进入的实验室,跟随学长负责的是网络模块的部分,我自己完成了对于IP地址的封装,完成了LHostAddress类(虽然他们两个最后没用我的代码,可能是懒得做修改和适配吧),供他们两个调用,在这个过程我学到了大型项目的编译方法,我们的项目sdk部分采用的是cmake编译链接的方式,非常好用,使用第三方软件conan进行第三方包的管理,在Linux平台下(也是我想要就业的平台方向)进行构建编译。暑假学长走后,针对代码过程出现的bug进行了修复,9月初结束了sdk部分的开发,现在转向了安全代码扫描部分的开发。

安全代码扫描部分,我们需要用开源项目llvm编译生成的clang-tidy可执行文件去扫描代码中的规范问题并提出警告,首先这涉及到的是clang编译器,我没用过,但是这个问题倒不是很大;第二是这个东西涉及到编译原理中的抽象语法树,这个东西我没学过,所以有点难,还好老师给我分配的任务是中低优先级,到目前为止还好。关于工作中的细节问题我放在下面了。

注意:下面由于我配置了ccache(这玩意用起来是真爽我操),编译器版本写"g++""gcc",不能让他直接调用我们安装的gccg++,要走ccache这一步哈,并且对于公司这边,记得gccg++一定要切为gcc-9(当然我没事也不会切)…

Larksdk工作内容

我主要负责的是网络模块后续的处理,目前我一个人感觉能够处理,基本到收尾阶段了。

cmake构建

第一次按照下面的cmake操作,后面就只用 cmake .. 就可以了

1
2
3
conan install ..
cmake -DCMAKE_C_COMPILER="gcc" -DCMAKE_CXX_COMPILER="g++" ..
make # 构建 LarkSDK 本体和 snippet 下面的测试代码片段

现在需要激活GoogleTest单元测试,激活构建目标tests,可以用如下:

1
2
3
4
5
cmake -DCMAKE_C_COMPILER="gcc" -DCMAKE_CXX_COMPILER="g++" -DENABLE_GTEST=ON ..

# 这两个根据需要进行操作
make # 构建 LarkSDK 本体和 snippet 下面的测试代码片段
make tests # 构建单元测试

如果显示doxygen相关的错误,那么记得安装;可能也需要安装一下graphviz

1
sudo apt install doxygen graphviz

2024/1/22 更新

在公司我的办公电脑上我安装的是Ubuntu虚拟机,上述在Wsl上的步骤可能不太适应原生的Ubuntu系统,所以可能编译会报错

我总结了一下,使用如下流程,前提是配置好了ccache,总结好下面的原因就是为了兼容ccachevscode当中的CMake tools,注意cmake后面是两个点

1
2
3
4
5
conan install ..
cmake -DENABLE_GTEST=ON ..
cmake ..
make
make tests

第一次cmake的时候,选择的编译器如下:

image-20240122174307585

第二次的时候如下:

image-20240122174342963

如果是这样,就表明配置成功了,在vscodeCMake Tools插件当中只能找到gccg++,虽然我们在配置ccache的时候做了软链接的映射,但是还是会出现各种问题,这样的流程可以有效的做到避免

然后进行make即可

单元测试和覆盖率检测

  • googletest版本使用1.12.1,去github下载源码进行编译安装

  • gcovr版本使用5.1,使用pip安装

本地运行单元测试,并且生成覆盖率报告,按照上面进行单元测试,在测试过程中,覆盖率数据将会被自动收集,然后我们通过gcovr工具生成这份报告,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装gcovr
sudo apt install pip
pip install gcovr

# 建议回到项目根目录执行 gcovr

# gcovr 可以一步直接生成测试率报告
# 注:若不是在项目根目录执行 gcovr, 需用 -r 参数指定项目根目录,即 build 的上一级目录,以同时找到源码文件和 gcov 中间数据文件(*.gcno、*.gcda)
# -e 参数用于排除无需覆盖率报告的源码文件,接受正则表达式。

# 生成单页 html 覆盖率简报
gcovr -e ".*3rdparty.*" --exclude-throw-branches --exclude-unreachable-branches --html build/gcovr.html

# 生成多页面 html 详细覆盖率报告到 gcovr 目录中
mkdir build/gcovr
gcovr -e ".*3rdparty.*" --exclude-throw-branches --exclude-unreachable-branches --html-details build/gcovr/gcovr.html

# 浏览器打开 build/gcovr.html 或 build/gcovr/gcovr.html即可查看单元测试覆盖率报告

后续

网络模块测试完毕啦,问题也全部解决,剩下的12月就在实验室复习,然后考完试就去上班!啦啦啦啦啦啦!~~~

安全代码扫描工作内容

LarkScanner

LarkScanner是已经写好的脚本,执行这个脚本可以执行国军标的检测文件clang-tidy

  • clang-tidy/src/gjb8114目录下的规则文件的编写:一个头文件.h,一个源文件.cpp,以表格中的序号命名

  • 编写完成之后,需要在gjb/samples目录下编写对应的两个源文件,一个是遵守规则的,一个是不遵守规则的,还是以序号命名,如果扫描出来之后遵守规则没有扫到然后不遵守规则的扫到了,那么就算成功

  • 编译命令

    1
    2
    3
    conan install .. //只用拉一次
    cmake -DPACKAGE_VERSION=1.0.1 -DCMAKE_C_COMPILER="gcc" -DCMAKE_CXX_COMPILER="g++" ..
    make

    make完毕之后在build/bin目录下生成可执行文件larkscan

    然后我们需要跑程序来检测samples目录下的各个程序

    1
    ctest -VV

    或者我们直接调用可执行程序larkscan来扫描样本目录的程序(我的第一个不行,只能用第二个目前)

    1
    2
    // 现在我们在build目录
    ./bin/larkscan ../gjb/
  • 我们需要把自己编译的规则拿到llvm工程当中去编译,见第二条,这样生成的新文件就包含了我们写的规则了,然后把生成的clang-tidy在我们的项目中clang-tidy/bin目录下替换掉,然后再把clang-tidy/binclang-tidy/lib目录再次拷贝到/opt/LarkStudio5/LarkScanner

1
2
3
4
cd /opt/LarkStudio5/LarkScanner

sudo cp /home/lzx0626/DavidingPlus/Lark5/larkscanner/clang-tidy/bin . -r
sudo cp /home/lzx0626/DavidingPlus/Lark5/larkscanner/clang-tidy/lib . -r

国军标规则编写

  • 国军标规则编写的流程

    注意,用官方的llvm工程它本身是不包含我们自己的模块的,想要编译我们自己的模块需要添加一些东西,见gitlab:

    点这里,注意挂梯子

    包含完之后就可以编译,然后注意每次加入新的规则都要将对应的先加入到Gjb8114TidyModule.cpp中和CMakeLists.txt

image-20230911151056393
  • (现在不需要)需要编写新的规则的时候,是有样本文件供我们参考的,现在工程中已经把所有的模板文件创建好了,所以不需要

    1
    2
    3
    4
    5
    sudo 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/ -r
  • llvm工程的编译

    记得使用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
  • 上传

    image-20230911155204282

使用clang-tidy

其中修复功能我们不需要管,注意有两个clang-tidy,一个是通过apt管理下载的官方的clang-tidy,另外一个是我们通过llvm工程添加了测试模块之后的自己的clang-tidy,这两个需要注意,我们自己的就在目录下./clang-tidy就好了,注意两个不要搞混了

image-20230912102946085

抽象语法树

查看抽象语法树

1
clang -c -Xclang -ast-dump test.cpp # test.cpp就是需要查看的cpp文件

结果示例:

image-20230914145403241

对象树匹配网站

AST Matcher Reference (llvm.org)

clang-query

使用示例

image-20230914150823694

目前写了的条数记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# A_1_5_1 R_1_6_12 R_1_5_2 R_1_6_5 R_1_7_8 R-1-6-8

# 拉取git代码,然后把别人更新的代码拷贝到llvm对应的目录

# 自己先把代码拉取了

# 首先需要把我自己的代码拷贝出去
cd /home/lark5/Lark5/llvm-project/clang-tools-extra/clang-tidy/gjb8114

# 后续自己添加
cp A_1_5_1* /home/lark5/Lark5/llvm-project
cp R_1_6_12* /home/lark5/Lark5/llvm-project
cp R_1_5_2* /home/lark5/Lark5/llvm-project
cp R_1_6_5* /home/lark5/Lark5/llvm-project
cp R_1_7_8* /home/lark5/Lark5/llvm-project
cp R_1_6_8* /home/lark5/Lark5/llvm-project

# 拷贝git拉取的代码修改的部分到llvm目录
cp /home/lark5/Lark5/larkscanner/clang-tidy/src/gjb8114/* . -r

# 移动回去
cd /home/lark5/Lark5/llvm-project/
mv *.cpp *.h /home/lark5/Lark5/llvm-project/clang-tools-extra/clang-tidy/gjb8114

进程记录

1
2
3
4
5
6
7
A-1-5-1:自测完成(已上传,等待反馈)
R-1-6-12:测试提的bug存在问题,已经解决(等待反馈)
R-1-5-2:自测完成(已上传,等待反馈)
R-1-6-5:自测完成(已上传,等待反馈)
R-1-7-8:自测完成(已上传,等待反馈)
R-1-6-8:自测完成(已上传,等待反馈)
R-1-6-19:交给学长处理了(我免费啦!)...

后续

马上就期末复习了,这部分交给一位研究生学长做了,所以后续内容不再更新…

使用搜索:必应百度