gpt4 book ai didi

c++ - Clang - 获取实际的函数指针声明回溯

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:48 24 4
gpt4 key购买 nike

我是 clang 的新手,正在研究 C/C++ 代码的解析。我将下面的代码作为输入,但无法使用 clang 找到实际的函数名称。

#include <stdio.h>

typedef int (*ExampleCallback)(void* something, int status);

//This will be in a separate file
void moduleAPI_start(ExampleCallback onSomething);
int moduleAPI_run();

static ExampleCallback storedCallback;

void moduleAPI_start(ExampleCallback onSomething)
{
storedCallback = onSomething;
}

int moduleAPI_run()
{
return storedCallback(NULL, '0');
}

//Callback implementing ExampleCallback signature
int myCallback(void* something, int status)
{
return status;
}

int main(void)
{
moduleAPI_start(myCallback);
printf("%d\n", moduleAPI_run());
return 0;
}

我的问题是,我怎么知道,每当我调用 moduleAPI_run 时,它实际上是通过 storedCallback 调用 myCallback

简而言之,我如何获得以下序列,以便我可以使用 myCallback 进行进一步处理。storedCallback->onSomething->myCallback

注意:我经历了this post,但无法得到明确的解决方案。

编辑:在更大的方面,我们正在尝试解决函数指针标识问题。我们使用具有不同目的的相同签名编写了不同的函数(在运行时将适当的函数注册为回调)。借助这个 clang 分析工具,我们希望可视化调用的实际函数。

最佳答案

My question is, how do I know that, whenever I call moduleAPI_run, it is actually calling myCallback via storedCallback.

这不是解析器或抽象语法树可以回答的问题。

回调不是固定函数。它是一个变量,其中包含指向可以分配和重新分配的函数的指针。因此它可以在程序运行过程中携带许多不同的值。对于能够在不运行程序的情况下回答相关问题的软件工具,称为 (添加到问题的标签):

https://en.wikipedia.org/wiki/Static_program_analysis

也许能够查看这个简单的单文件示例,您自己会看到 storedCallback 被分配到一个地方......并且这个地方只执行一次,没有路径避开它.但由于暂停问题,分析工具实际上不可能告诉您任意输入程序在运行时的行为方式——如果您还没有意识到那:

https://en.wikipedia.org/wiki/Halting_problem

仅从您的一个示例中,我不知道您要涵盖的查询类别到底是什么。但我会说静态分析工具往往具有相当特殊的用途——主要用于查找错误。许多是商业化且昂贵的。

更新:结果是 Clang 本身 has a static analyzer (而且显然是一个非常好的)。但乍一看,我没有看到它的任何“API”,只是如何使用该工具。因此,如果您想要访问它用于生成报告的信息,您可能必须破解并修改代码。但其他人可能比我更了解。

关于c++ - Clang - 获取实际的函数指针声明回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32211218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com