• [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中不必须是静态成员。

  • 相关阅读:
    CSS3 box-shadow(阴影使用)
    缩小窗口时CSS背景图出现右侧空白BUG的解决方法
    html打开个人QQ聊天页面
    帮助你实现元素动画的6款插件
    给出两个颜色,计算中间颜色返回数组
    名字首字母
    自适应网页设计
    tab切换jquery代码
    改变上传文件样式
    剑指offer 面试16题
  • 原文地址:https://www.cnblogs.com/lilylee/p/5508191.html
Copyright © 2020-2023  润新知