如何制止AST错误地将这种类型的函数声明解释为变量声明?

时间:2019-09-05 14:17:33

标签: clang abstract-syntax-tree

我正在使用clang的抽象语法树生成来为某些源文件生成AST。它很好地映射了正常的函数,但是它跳闸了某些函数,将它们错误标记为变量声明。这样做时,它会等待分号完成此声明,因此不会在问题函数之后映射出源文件的其余部分。有没有办法让clang意识到这是一个函数定义,而不是变量声明?

我在函数定义后放置了分号,这样做使clang忽略了函数的内容,但至少它会在源文件中为其后的代码生成节点。我正在使用prophy python接口与脚本中的clang进行交互,但是手动运行clang并发现了相同的东西。

这是clang映射的函数示例:

int killProcess(int pid)
{
    int ret=1;

    HANDLE pHandle;

    if ((pHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid)) != NULL)
        if(!TerminateProcess(pHandle,0)) {
            ret=0;
            CloseHandle(pHandle);
        }

    return ret;
}

这是一个函数的示例,clang认为这是一个变量声明,如果在右大括号后没有分号,则会忽略此变量之后的所有内容:

DWORD WINAPI listProcessesThread(LPVOID param)
{
    char sendbuf[IRCLINE];

    LPROC lproc = *((LPROC *)param);
    LPROC *lprocp = (LPROC *)param;
    lprocp->gotinfo = TRUE;

    sprintf(sendbuf,"[PROC]: Listing processes:");
    if (!lproc.silent) irc_privmsg(lproc.sock,lproc.chan,sendbuf,lproc.notice);

    if (listProcesses(lproc.sock,lproc.chan,lproc.notice,NULL, FALSE, lproc.full) == 0)
        sprintf(sendbuf,"[PROC]: Process list completed.");
    else
        sprintf(sendbuf,"[PROC]: Process list failed.");

    if (!lproc.silent) irc_privmsg(lproc.sock, lproc.chan, sendbuf, lproc.notice);
    addlog(sendbuf);

    clearthread(lproc.threadnum);

    ExitThread(0);
}

预期结果是clang知道这是一个函数并生成相应的AST,但事实并非如此。它使用拼写“ WINAPI”而不是“ FUNCTION_DECL”节点构造一个VAR_DECL节点。运行“ clang -cc1 -ast-dumpprocesses2.cpp”时给出的错误是:

`-VarDecl 0x5625ad7ab2e0 col:7无效的WINAPI'int' 产生1个错误。

在其日志末尾。直到生成并显示为止的抽象语法树。

NB:因为我在Ubuntu计算机上工作,所以我没有安装WINAPI库。

0 个答案:

没有答案