带有Undefined Behavior Sanitizer的共享库(clang ++)

时间:2017-09-06 08:50:48

标签: c++ clang llvm undefined-behavior

运行带有dlopen函数的可执行文件时出现问题,该函数用于通过一个简单的函数打开共享和清理的库。

我使用预编译的Clang 3.9.0 for Ubuntu 14.04。

我的问题是:是否可以正确运行它,因此我可以在运行可执行文件时在库中查找未定义的行为错误?如果答案是肯定的,那么如何?

我有两个文件:

//simpledll.cpp
#include <cstdio>

int hehe(int argc) {
      int k = 0x7fffffff;
        k += argc;
          return 0;
}

//dlopen.cpp
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int main() {
    void* handle;

    handle = dlopen("simpledll.so", RTLD_LAZY);
    if(!handle) {
        fprintf(stderr, "%s\n", dlerror());
    }

    int (*function)(int) = reinterpret_cast<int (*)(int)> (dlsym(handle, "_Z4hehei"));

    if (function == nullptr)
        fprintf(stderr, "Nope\n");
    else
        function(1000); // this yields signed integer overflow

    return 0;
}

我试图让它分两步完成(都失败了)

第一步

使用以下命令编译可执行文件:

clang++ dlopen.cpp -ldl --std=c++11 -o dlopen

使用以下代码编译库:

clang++ -fsanitize=undefined -shared -o simpledll.so -fPIC simpledll.cpp

结果:

./dlopen: symbol lookup error: simpledll.so: undefined symbol: __ubsan_handle_add_overflow

第二步(来自此forum的想法)

编译可执行文件,如第I步

使用以下代码编译库:

clang++ -fsanitize=undefined -shared -Wl,--whole-archive -L/usr/local/lib/clang/3.9.0/lib/linux/ -lclang_rt.ubsan_standalone_cxx-x86_64 -Wl,--no-whole-archive -lclang_rt.ubsan_standalone-x86_64 -Wl,--no-whole-archive -o simpledll.so -fPIC simpledll.cpp

结果:

==11478==Sanitizer CHECK failed: /home/development/llvm/3.9.0/final/llvm.src/projects/compiler-rt/lib/ubsan/ubsan_init.cc:61 ((UBSAN_MODE_UNKNOWN)) != ((ubsan_mode)) (0, 0)

请注意,在第二步中,如果我们将共享库中的函数替换为没有未定义行为代码的函数,程序将在没有 CHECK失败错误的情况下运行。这表示 UBSAN找到了未定义的行为代码,但无法正确报告。

此致

Jaszczur

0 个答案:

没有答案