c++ - 如何从 Clang 中的 CallExpr 获取函数指针的参数?

标签 c++ c clang llvm function-pointers

我正在尝试分析其中包含函数调用的 C 源代码。我能够使用下面的源代码分析正常的函数调用以毫无问题地获取它们的参数,其中 ce 是一个 CallExpr 对象:

1.  if(ce != NULL) {            
2.      QualType q = ce->getType();
3.      const Type *t = q.getTypePtrOrNull();
4.
5.      if (t != NULL) {
6.          llvm::errs() << "TYPE: " << t->isFunctionPointerType() << " " << q.getAsString() << " " << t->isPointerType() << "\n";
7.      } else {
8.          llvm::errs() << "FUNCTION CE HAS NO TYPE?\n";
9.      }
10.
11.
12.     const Decl* D = ce ->getCalleeDecl();
13.     while(D->getPreviousDecl() != NULL) 
14.         D = D->getPreviousDecl();
15.         
16.     llvm::errs() << "Kind:  " << D->getDeclKindName() << "\n";
17.     
18.     FunctionDecl* fd = (FunctionDecl*) llvm::dyn_cast<FunctionDecl>(D);
19.     for(int x = 0; x< fd ->getNumParams(); x++) {
20.         if(fd ->getParamDecl(x)->getType()->isAnyPointerType()) {
21.             // Do Stuff Here
22.         } 
23.     }
24. }

上述源代码的问题出现在第 18 行,当我尝试将 Decl 从 CallExpr 类型转换为 FunctionDecl 时,这导致 fd 变为 NULL 如果 CallExpr 来自函数指针调用。

我尝试通过在第 16 行打印类型来进行调试。对于函数指针,它指定 Decl on 12VarDecl,而不是正常的 FunctionDecl函数调用。

我也尝试过使用 isFunctionPointerType(),但返回的是 false。

这是一段导致段错误的源代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    void* (*mp)(size_t size);
    void *mpp;

    mp = &malloc;
    mpp = mp(30);

    free(mpp);
    return (0);
}

有没有办法使用 clang 来检测 CallExpr 是否是函数指针调用?如果是这样,如何获取参数列表?

我正在使用 clang 3.1

谢谢

最佳答案

使用getDirectCallee()函数(我不确定它是否在clang 3.1中可用) FunctionDecl *func = ce->getDirectCallee();

if (func != NULL){
    for(int i = 0; i < func->getNumParams(); i++){
        if(func->getParamDecl(i)->getType()->isFunctionPointerType()){
            // Do stuff here
        }
    }
}

关于c++ - 如何从 Clang 中的 CallExpr 获取函数指针的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25359555/

相关文章:

c++ - 多个定义的符号 C++ 错误

c++ - 32 位程序无法捕获在 32 位进程上进行的击键,但能够捕获在 64 位进程上进行的击键

c - 数组结构排序 - C

c - 如何使用 Tcl_ReadChars 从二进制文件读取 float ?

c++ - 为什么 clang 输出对齐特定的东西

clang - 静态库链接错误。架构armv7s的 undefined symbol

c++ - 如何捕捉窗口大小调整?

c++ - OpenGL:GL_QUADS 不绘制正方形

c - 如何按 C 中的优先级对列表项进行排序?

Clang 集成汇编程序和 “unknown token in expression” 在否定期间