C++ LLVM查找分配内存的每条指令
我想找到在LLVM IR中分配内存的每条指令。对于堆栈分配,我只需执行以下操作:C++ LLVM查找分配内存的每条指令,c++,llvm,C++,Llvm,我想找到在LLVM IR中分配内存的每条指令。对于堆栈分配,我只需执行以下操作: Instruction* I; if (AllocaInst* AI = dyn_cast<AllocaInst>(I)) { //stack allocation } 指令*I; 如果(AllocaInst*AI=dyn_cast(I)){ //堆栈分配 } 但是堆和静态(全局)分配呢? 在LLVM IR中还可以分配哪些内存 如果LLVM版本有所不同,请提供您所参考的版本。内
Instruction* I;
if (AllocaInst* AI = dyn_cast<AllocaInst>(I)) {
//stack allocation
}
指令*I;
如果(AllocaInst*AI=dyn_cast(I)){
//堆栈分配
}
但是堆和静态(全局)分配呢?
在LLVM IR中还可以分配哪些内存
如果LLVM版本有所不同,请提供您所参考的版本。内存分配可以是堆栈或堆。对于堆栈分配,您所做的是正确的,您需要检查alloca指令。堆分配由malloc函数调用完成,没有显式的IR指令 我不做任何实验,但这可能是你可以尝试的方式
if(MemSetIntrinsic *MSI = dyn_cast<MemSetIntrinsic>(I))
// This call instruction is a memory allocating instruciton
if(memsetinnal*MSI=dyn_cast(I))
//此调用指令是一个内存分配指令
最终,您将无法完美地检测到这一点。堆分配归结为操作系统调用,有人可以直接使用内联程序集进行这些调用。还有一些库调用是链接到的,您将看不到它们
无论你在做什么,都要记住这一点 如果您可以直接对指令进行内部one测试,那么嵌套所有这些测试是没有意义的。另外,您应该只查找调用并检查被调用函数的名称是否为malloc。感谢您的更正,我做了相应的更改。检查函数名是不够的,检查“memsetinfrance”是更通用的方法。Malloc不是一个内在函数,“memsetinfrance”类包装llvm.memset内在函数,它没有分配内存(正如op所要求的)。实际上不是+1内联程序集实现,以进行系统调用以分配内存-这是可能的。但对于分配内存的系统调用,在我的内核上执行“nm vmlinux|grep sys|”,我可能只能看到两个——sys_brk()和sys_mmap()。其余的不太清楚,但我觉得不多。至于库调用:是的,不同库中的不同API可以分配。例如,libc中的“malloc()”就是其中之一。因此,忽略库,只关注系统调用,因为malloc()基本上仍然在调用brk()。他可能还想知道如何使用非linux内核或非posix系统来实现这一点,你能列出这个列表吗?否则,我认为“无法完全检测到这一点”似乎是准确的。请从Google中查找MemorySanitizer:以及它的工作原理:它只截取了一个函数“malloc()”,足以覆盖大部分内存分配场景。