我在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 == at 0x4039280 :(匿名命名空间):: Hello :: runOnModule(llvm :: Module&amp;)(在/home/alex/llvm/Release+Asserts/lib/Hello.so中) == 5134 == by 0x8E33DE3:llvm :: MPPassManager :: runOnModule(llvm :: Module&amp;)(在/ home / alex / llvm / Release + Asserts / bin / opt中) == 5134 == by 0x8E3726F:llvm :: PassManagerImpl :: run(llvm :: Module&amp;)(在/ home / alex / llvm / Release + Asserts / bin / opt中) == 5134 == by 0x8E37385:llvm :: PassManager :: run(llvm :: Module&amp;)(在/ home / alex / llvm / Release + Asserts / bin / opt中) == 5134 == by 0x41AE4D2 :(低于主要)(libc-start.c:226) == 5134 ==地址0x46cfa40在分配大小为200的块后为0字节 == 5134 == at 0x402C454:operator new [](unsigned int)(在/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so中) == 5134 == by 0x4037AE0 :(匿名命名空间):: Hello :: runOnModule(llvm :: Module&amp;)(在/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)
我认为主要问题是: 我没有为价值分配好记忆。或者我可能只为Value *指针分配,而不是为实际值分配。也许我不释放内存。 2.我不能使用数组而不是矢量,因为is-&gt; setMetadata(“path”,MDNode :: get(C,values));不会让我。
您认为使用Valgrind可能值得吗?它怎么能帮到我?我只想附加一些整数作为元数据,每个操作数一个整数。
感谢您的任何建议!