2021SC@SDUSC
libsecp256k1的构建与测试
- 构建步骤
- Exhaustive tests
- 测试覆盖率
在上一篇博客中,基本环境搭建和代码的整理已经结束,本篇将进行项目的构建与测试。通过这一过程加深对项目的理解和认识,便于认识项目中哪些文件代码才是需要重点分析的核心片段。
构建步骤
前面提到,libsecp256k1 是使用 autotools 构建的,autogen.sh是个shell脚本,它的作用就是将自动产生Makefile的过程集成到脚本中,简化操作,执行代码./autogen.sh
即可,但事实上经过我的尝试,输入该语句并没有反应,即便是尝试输入chmod 777 ./autogen.sh
也无济于事。生成makefile的具体过程还请参加我的上一篇博客。
下面需要执行代码./configure
,执行结果如下:
通过./configure命令对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系,通常./configure命令是源代码安装的第一步。
执行make
命令,能正常执行make命令的前提是makefile文件已经正常生成,否则只会得到下图这样的结果:
make命令会根据Makefile文件编译源代码、连接、生成目标文件、可执行文件。
执行make check
命令,对上一步 make 进行检查,确保 make 是没有错误的,执行结果error为0,执行该步操作等待了较长时间,大概三分钟,测试图如下:
同时该指令输入结束后会自动生成三个文件,分别为tests.log文件,tests.trs文件和test-suite.log文件,三个文件中有关于测试结果的信息,测试结果如下图所示,在图片左上角你可以看到三个文件的名字:
下面执行一个可选命令sudo make instal
,该命令可将程序安装至系统中。如果原始码编译无误,且执行结果正确,便可以把程序安装至系统预设的可执行文件存放路径。执行结果如下图所示:
Exhaustive tests
下面执行命令./exhaustive_tests
运行可执行文件exhaustive_tests,运行时会自动生成相应测试参数。
下面执行命令valgrind --max-stackframe=2500000 ./exhaustive_tests
,在执行该命令前需要前先安装valgrind,valgrind用于Linux程序的内存调试和代码剖析,可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得程序更加稳固。这里使用 valgrind需要增加最大堆栈大小,将其设为250000。输入安装指令即可下载安装。
增加最大堆栈大小后再执行exhaustive_tests。结果如下所示,该步操作进行较长时间,大概五分钟才运行结束:
测试覆盖率
该libsecp256k1库旨在全面覆盖可到达的线路和分支。为了直观看到覆盖率,可以生成测试覆盖率的报告。要创建报告,需要配置–enable-coverage(在配置前需确认自己已经配置好gcc):
./configure --enable-coverage
运行测试:输入make check
命令,可以看到目标可执行文件tests发生错误,tests文件消失。
由于gcovr包括分支coverage报告,可用它来创建报告,输入gcovr --exclude 'src/bench*' --print-summary
命令。
要使用带颜色和带注释的源代码创建 HTML 报告,首先创建coverage目录文件,输入mkdir -p coverage
命令即可看到当前目录下创建了一个名为coverage的文件夹。
在coverage目录下创建html文件需输入指令gcovr --exclude 'src/bench*' --html --html-details -o coverage/coverage.html
,输入完成后在coverage目录下可看到生成的12个html文件。
报告中对src目录下9个文件和bits目录下2个文件生成了html文件报告。
以field_impl.h文件为例,生成报告如下图所示:
除上述11个文件报告之外,还有一个coverage总报告,对Lines和Branches的覆盖率进行总体评估。报告情况如下图所示: