2017-12-26 22 views
3

最近LLVMで作業を始めました。私は、次のコードmalloc関数呼び出しを検出するためのLLVMパスの作成、割り当てられたバイト数とそのメモリを指す変数名

string = (char *)malloc(100); 
string = NULL; 

を与えLLVMでパスを記述しようと対応LLVM IR

%call = call noalias i8* @malloc(i64 100) #3 
store i8* %call, i8** %string, align 8 
store i8* null, i8** %string, align 8 

いは、(この場合は100で)割り当てnumber of bytesを抽出し、addressmallocを呼び出す命令を検出します返された変数名とそのアドレスが割り当てられている変数名を返します。

std::map<std::string, std::tuple<size_t, int> > mem_addrs; // stores pointer name, address and no. of bytes allocated 
Count() : ModulePass(ID) {} 

virtual bool runOnModule(Module &M) { 
    for (Function &F: M) { 
    for (BasicBlock &B: F) { 
     for (Instruction &I: B) { 
      if(CallInst* call_inst = dyn_cast<CallInst>(&I)) { 
       Function* fn = call_inst->getCalledFunction(); 
       StringRef fn_name = fn->getName(); 
       errs() << fn_name << " : " << "\n"; 
       for(auto args = fn->arg_begin(); args != fn->arg_end(); ++args) { 
        ConstantInt* arg = dyn_cast<ConstantInt>(&(*args)); 
        if (arg != NULL) 
          errs() << arg->getValue() << "\n"; 
       }  
      } 
     } 
    } 
    } 

出力は私がmallocの指示を検出することができる午前

-VirtualBox:~/program_analysis$ opt -load $LLVMLIB/CSE231.so -analyze -count < $BENCHMARKS/leaktest/leaktest.bc > $OUTPUTLOGS/welcome.static.log 
ok 
allocaimw 
allocaleak 
allocamalloc : 0x2f5d9e0 
0 opt    0x0000000001315cf2 llvm::sys::PrintStackTrace(_IO_FILE*) + 34 
1 opt    0x0000000001315914 
2 libpthread.so.0 0x00007f0b53f12330 
3 opt    0x00000000012ec78f llvm::APInt::toString(llvm::SmallVectorImpl<char>&, unsigned int, bool, bool) const + 79 
4 opt    0x00000000012ed309 llvm::APInt::print(llvm::raw_ostream&, bool) const + 57 
5 CSE231.so  0x00007f0b52f16661 
6 opt    0x00000000012ad6cd llvm::legacy::PassManagerImpl::run(llvm::Module&) + 797 
7 opt    0x000000000058e190 main + 2752 
8 libc.so.6  0x00007f0b5313af45 __libc_start_main + 245 
9 opt    0x00000000005ab2ca 
Stack dump: 
0. Program arguments: opt -load /home/hifza/program_analysis/llvm/build/Release+Asserts/lib/CSE231.so -analyze -count 
1. Running pass 'Instruction Counts Pass' on module '<stdin>'. 
Segmentation fault (core dumped) 

ですが、私は、対応するメモリアドレスと割り当てられたバイト数を見つけることができないのです。誰でもこのことをどうやって進めることができますか?ありがとう。

+0

'args'のループは' ConstantInt'を100にしませんか? – arrowd

+0

正しく印刷できません。ループの何らかのエラーのためにこのコードを実行するとコードがダンプされる – Hif

+0

さて、エラーを投稿してください。 – arrowd

答えて

1

dyn_cast<ConstantInt>(&(*args))の結果を確認していません。キャストタイプがConstantIntでない場合、nullptrを返します。そして、次の行(arg->getValue())であなたはそれを逆参照します。

+0

私はそれがNULLであるかどうかをチェックしようとしましたが、何も印刷しません。 – Hif

+0

小切手でコードを表示してください。 – arrowd

+0

if(arg!= NULL) // errs()<< arg-> getValue()<< "" \ n "; – Hif

関連する問題