3

我在 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?它对我有什么帮助?

感谢您的任何建议!

............

作为更新,我在一些基本块中收到内存损坏错误。以下是调试输出:

  1. 选择 -opt: malloc.c:3801: _int_malloc: Assertion (unsigned long)(size) >= (unsigned long)(nb) failed.

  2. gdb -

    Program received signal SIGABRT, Aborted.
    0xb7fdd424 in __kernel_vsyscall ()
    
  3. 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?它对我有什么帮助?我只想附加一些整数作为元数据,每个操作数一个整数。

感谢您的任何建议!

4

0 回答 0