[Linux]klee以及某内存泄漏检测工具安装使用遇到的坑

每次做内存泄漏的内容都是一次linux下的c语言速成强化班,感觉每隔一段时间就让我回顾一下linux下的编程。但是作为一个不长期使用linux编程环境的人来说,还是遇到了不少坑,尤其是环境。

首先KLEE作为一个符号执行工具确实有其强大之处,官网详见http://klee.github.io/ 

论文可以参见OSDI2008 KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs 。

为了修改之前符号执行的实验,我需要重新使用KLEE得到一个高覆盖度的测试用例集。(klee的参数真的很重要)

我首先需要重现论文中关于coreutils的实验,环境是LLVM2.9。步骤详见 http://klee.github.io/tutorials/testing-coreutils/

首先第一步gcov编译时,提示一些文件相关的变量没有声明,比如说S_IXUGO,我看了下都是sys/stat.h里面的,但是环境变量应该包括了的。

就这样坑了我一整天,直到我把那个文件里的#include <sys/stat.h>换成了<include/stat.h>报错之后又改回了<sys/stat.h>,再make它居然好了。虽然我至今没有明白原理是什么。

第二步使用llvm编译,提示连接时找不到库,比如rt,但是librt.a明明也在环境变量中,在调试了很久未果后,我直接ln -s 链到了当前文件夹,之后就开始报库cap找不到,之后我只好把cap也链过来。(当然这并不是一个明智的方法,还好需要这样做连接的库不多)

这里linux有个大坑就是,凡是很敏感的环境变量,比如$LIBRARY_PATH, $LD_LIBRARY_PATH, $C_INCLUDE_PATH, $CPLUS_INCLUDE_PATH等等……最前面不要有: !!!因为我们在使用LIBRARY_PATH=$LIBRARY_PATH:XXX时很容易在本身$LIBRARY_PATH为空的情况下前面加个: 。因此在编译任何gcc、llvm等编译器相关的东西时,先env看一下环境变量对不对。

至此KLEE可以使用了。如果想统计覆盖度,需要再用gcov编译一下coreutils。

生成测试用例的命令例如 klee --sym-args 1 10 10 --sym-files 2 2000 --max-fail 1 tr.bc

最后使用klee-stats能够看到的覆盖度包含Branch Coverage(分支覆盖)以及Instruction Coverage(指令覆盖),但是覆盖度的衡量里,还是使用的gcov进行的。即便是BCov和ICov不高的情况下(30%-40%),有可能最终的覆盖度有80%。

----------------------------------我是分割线-------------------------------------------

一篇论文中提及的内存泄漏工具,Leakfix,主要基于LLVM的基础上开发。

首先需要安装binutils中的gold-ld,该软件对GCC版本有要求(最低4.1.2),(后面的编译需要c++11,事实上需要GCC4.7以上版本),虚拟机上的gcc版本太低,干脆去装了一个最新的5.3版本的GCC。这时候依赖包就开始各种出错了……

高版本GCC需要 gmp4.2+ mpfr2.3.1+ mpc0.8.0+。网上有具体教程不再赘述。

最重要的一点:一定要unset所有编译相关的环境变量!

----------------------------------我是分割线-------------------------------------------

在过程中还遇到了两个问题,在此记录一下。

①-Werror编译选项,是把warning当做error一样处理,即遇到warning也会停止编译。

②在C++98中,支持了在类声明中使用等号“=”加初始值的方式,来初始化类中静态成员常量。这种声明方式我们也称之为“就地”声明。就地声明在代码编写时非常便利,不过C++98对类中就地声明的要求却非常高。如果静态成员不满足常量性,则不可以就地声明,而且即使常量的静态成员也只能是整型或者枚举型才能就地初始化。而非静态成员变量的初始化则必须在构造函数中进行。这种情况下C++11中不必须是静态成员。

 

原文链接: https://www.cnblogs.com/lilylee/p/5508191.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    [Linux]klee以及某内存泄漏检测工具安装使用遇到的坑

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/233852

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午4:03
下一篇 2023年2月13日 下午4:03

相关推荐