Memory leaks 禁用LLVM LLI解释器上的内存异常

Memory leaks 禁用LLVM LLI解释器上的内存异常,memory-leaks,llvm,llvm-clang,llvm-ir,lli,Memory Leaks,Llvm,Llvm Clang,Llvm Ir,Lli,运行lli解释器时是否有方法禁用异常? 我想禁止以下程序崩溃,这样我就可以进行内存分析了--它当前会在一个“释放后释放”错误后中止: 我正在使用的程序是: #include <stdio.h> #include <stdlib.h> int main() { int *ptr; int *ptr2; int z = 10; int n = 5; ptr = (int*)malloc(n * sizeof(int)); /

运行lli解释器时是否有方法禁用异常? 我想禁止以下程序崩溃,这样我就可以进行内存分析了--它当前会在一个“释放后释放”错误后中止:

我正在使用的程序是:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *ptr;
    int *ptr2;
    int z = 10;
    int n = 5;

    ptr = (int*)malloc(n * sizeof(int));
    // ptr2 = (int*)malloc(z * sizeof(int));

    free(ptr);
    free(ptr);

    return 0;
}
#包括
#包括
int main()
{
int*ptr;
int*ptr2;
int z=10;
int n=5;
ptr=(int*)malloc(n*sizeof(int));
//ptr2=(int*)malloc(z*sizeof(int));
免费(ptr);
免费(ptr);
返回0;
}
然后我将其转换为LLVM IR,然后使用lli进行解释:

$ /usr/local/opt/llvm/bin/lli example_opt.ll > out.txt
lli(23782,0x7fff9934a380) malloc: *** error for object 0x7f9bee411780: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Stack dump:
0.  Program arguments: /usr/local/opt/llvm/bin/lli example_opt.ll 
0  lli                      0x0000000103a76be8 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37
1  lli                      0x0000000103a76fe6 SignalHandler(int) + 200
2  libsystem_platform.dylib 0x00007fff60c13f5a _sigtramp + 26
3  libsystem_c.dylib        0x00007fff6099290f __sfvwrite + 407
4  libsystem_c.dylib        0x00007fff609b11ae abort + 127
5  libsystem_malloc.dylib   0x00007fff60aaf8a6 free + 521
6  libsystem_malloc.dylib   0x0000000104c4e080 free + 18446603343269325283
7  lli                      0x000000010378708d llvm::MCJIT::runFunction(llvm::Function*, llvm::ArrayRef<llvm::GenericValue>) + 861
8  lli                      0x00000001037114e7 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, char const* const*) + 1159
9  lli                      0x0000000103407a29 main + 8473
10 libdyld.dylib            0x00007fff60905015 start + 1
11 libdyld.dylib            0x0000000000000002 start + 18446603338896093166
Abort trap: 6
$/usr/local/opt/llvm/bin/lli示例\u opt.ll>out.txt
lli(23782,0x7fff9934a380)malloc:**对象0x7f9bee411780的错误:未分配要释放的指针
***在malloc\u error\u break中设置断点以进行调试
堆栈转储:
0程序参数:/usr/local/opt/llvm/bin/lli示例\u opt.ll
0 lli 0x0000000103a76be8 llvm::sys::PrintStackTrace(llvm::raw_ostream&)+37
1 lli 0x0000000103a76fe6信号处理器(内部)+200
2 libsystem_platform.dylib 0x00007fff60c13f5a_sigtramp+26
3 libsystem_c.dylib 0x00007fff6099290f_uuSFVwrite+407
4 libsystem_c.dylib 0x00007fff609b11ae中止+127
5 libsystem_malloc.dylib 0x00007fff60aaf8a6自由+521
6 libsystem_malloc.dylib 0x0000000104c4e080 free+1844660334326932283
7 lli 0x000000010378708d llvm::MCJIT::runFunction(llvm::Function*,llvm::ArrayRef)+861
8 lli 0x00000001037114e7 llvm::ExecutionEngine::RunFunctionsMain(llvm::Function*,std::_1::vector const&,char const*const*)+1159
9 lli 0x0000000103407a29干管+8473
10 libdyld.dylib 0x00007fff60905015启动+1
11 libdyld.dylib 0x0000000000000002开始+18446603338896093166
中止陷阱:6

lli
工具使用即时编译作为执行LLVM IR代码的默认方法。在您的示例中也是如此-请参阅调用堆栈中的
llvm::MCJIT::runFunction()

第一步是使用解释器模式

lli -force-interpreter example_opt.ll

您可以a)报告一个bug,b)提交一个补丁,c)与它一起使用,或者d)用更宽容的实现替换free,例如
void-free(void*){}
,适合调试,但不适合生产。我不认为方案a是富有成效的,b可能会受到热烈欢迎,c和d我只是提出供您考虑。谢谢!我使用(d)它只是为了记录在案,它在Ubuntu上工作,但在mac os x上不工作(除非我有旧版本的lli)