我在 LLVM 通道中有一些 C++ 内存损坏问题,我不知道如何解决它们。这是我的一段代码:
在我拥有的每个基本块的大循环中:
std::vector<Value*> values(cnt);
// Value** values=new Value*[cnt];
// for(gy=0;gy<cnt;gy++){
// values[gy] = new Value;
// }
if(is)
{
LLVMContext& C = is->getContext();
errs()<<"\ni: \n";
for(i=0;i<cnt;i++){
values[i]=ConstantInt::getSigned(Type::getInt64Ty(C),myArray[i]);
errs()<<" "<<myArray[i];
}
//SmallVector<Value*>* bla = new SmallVector<Value*>(200);
std::vector<Value*> bla(200);
//SmallVector<Value*,200> bla;
for(i=0;i<cnt;i++){
bla.push_back(values[i]);
}
is->setMetadata("path",MDNode::get(C,bla));
errs()<<"\nmodified instr "<<*is<<"\n";
if( (is->getMetadata("path")) ){
for(i=0;i<cnt;i++){
if(is->getMetadata("path")->getOperand(i)) {
errs()<<"\nget instr "<<*(is->getMetadata("path")->getOperand(i))<<"\n";
}
}
}
bla.clear();
//for(i=0;i<cnt;i++)
//delete values[i];
}
values.clear();
错误是:
opt: malloc.c:3790: _int_malloc: Assertion `(unsigned long)(size) >= (unsigned long)(nb)' failed.
循环中没有打印任何内容(仅当我到达第 7 个基本块时,这与其他块相似)。
//
我还尝试了代码中注释的替代方案。也许堆栈内存以某种方式损坏,我需要在堆上分配向量/数组(我尝试了一些变体)?我还尝试先从向量/数组中删除元素,然后删除指向数组/向量的指针。我不得不提一下,当我必须添加的元数据不是那么大(只有 18 个操作数而不是 72 个)时,它运行良好。你认为是否值得使用 Valgrind?它对我有什么帮助?
感谢您的任何建议!
............
作为更新,我在一些基本块中收到内存损坏错误。以下是调试输出:
选择 -
opt: malloc.c:3801: _int_malloc: Assertion (unsigned long)(size) >= (unsigned long)(nb) failed.
gdb -
Program received signal SIGABRT, Aborted. 0xb7fdd424 in __kernel_vsyscall ()
valgrind - 它执行所有代码,并且在有问题的循环迭代中我有:
==5134== 大小为 4 的无效写入 ==5134== 在 0x4039280: (匿名命名空间)::Hello::runOnModule(llvm::Module&) (在 /home/alex/llvm/Release+Asserts/lib/Hello .so) ==5134== by 0x8E33DE3: llvm::MPPassManager::runOnModule(llvm::Module&) (in /home/alex/llvm/Release+Asserts/bin/opt) ==5134== by 0x8E3726F: llvm ::PassManagerImpl::run(llvm::Module&) (在 /home/alex/llvm/Release+Asserts/bin/opt) ==5134== by 0x8E37385: llvm::PassManager::run(llvm::Module&) (在/home/alex/llvm/Release+Asserts/bin/opt)==5134== by 0x41AE4D2:(低于 main)(libc-start.c:226)==5134== 地址 0x46cfa40 在 a 之后是 0 个字节大小为 200 的块已分配 ==5134== 在 0x402C454:运算符 new[](unsigned int)(在 /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so 中)==5134== 由 0x4037AE0 :(匿名命名空间)::Hello::runOnModule(llvm::Module&) (在 /home/alex/llvm/Release+Asserts/lib/Hello.so)
并重复。
==5230== HEAP SUMMARY:
==5230== in use at exit: 95,110 bytes in 317 blocks
==5230== total heap usage: 33,395 allocs, 33,078 frees, 4,484,753 bytes allocated
==5230==
==5230== LEAK SUMMARY:
==5230== definitely lost: 7,732 bytes in 31 blocks
==5230== indirectly lost: 85,864 bytes in 275 blocks
==5230== possibly lost: 0 bytes in 0 blocks
==5230== still reachable: 1,514 bytes in 11 blocks
==5230== suppressed: 0 bytes in 0 blocks
==5230== Rerun with --leak-check=full to see details of leaked memory
==5230==
==5230== For counts of detected and suppressed errors, rerun with: -v
==5230== ERROR SUMMARY: 16432 errors from 15 contexts (suppressed: 0 from 0)
我认为主要问题是: 1. 我没有为值分配良好的内存。或者,也许我只为 Value* 指针分配,而不是为实际值分配。也许我没有释放内存。2. 我不能用数组代替向量,因为 is->setMetadata("path",MDNode::get(C,values)); 不让我。
你认为是否值得使用 Valgrind?它对我有什么帮助?我只想附加一些整数作为元数据,每个操作数一个整数。
感谢您的任何建议!