Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ LLVM查找分配内存的每条指令_C++_Llvm - Fatal编程技术网

C++ LLVM查找分配内存的每条指令

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版本有所不同,请提供您所参考的版本。内

我想找到在LLVM IR中分配内存的每条指令。对于堆栈分配,我只需执行以下操作:

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()”,足以覆盖大部分内存分配场景。