Java-程序所有可能的函数执行路径查找算法?

Java-程序所有可能的函数执行路径查找算法?

想挽留 发布于 2017-04-10 字数 390 浏览 1112 回复 3

C语言为例:

int main (void)
{
funcA();
funcB();
return 0;
}

void funcA()
{
if (condition)
{
funcC();
} else {
funcD();
}
}

void funcB()
{
//
}

void funcC()
{
//
}

void funcD()
{
//
}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晚风撩人 2017-09-26 3 楼

c和java都不懂,我来说说PHP吧。
在我的印象中是无法获取函数的执行路径的,除非在函数返回值时将路径返回,否则无法实现。
当然,这是我个人的观点,不排除浪迹天涯、冯义军等神牛有实现方法。

想挽留 2017-09-04 2 楼

可以这么认为:把函数间的调用关系想象成有向图,一个函数就是节点,调用关系就是边(调用者指向被调用者)。要解决的问题就是从只有出度的点到只有入度的点有几条路径。
起点可以认为只有主函数,终点可能有好几个。

去找找图的算法吧。个人认为深搜就可以

甜柠檬 2017-07-30 1 楼

用二叉树应该可以解决!
函数只有执行、不执行两种情况,假定根节点为当前函数名,左儿子为条件成立后执行的函数名,右儿子为条件不成立,即不执行函数名,构造一个数据结构

struct FuncPathTree{
struct FuncPath *left; //条件成立,执行的函数
struct FuncPath *right; //条件不成立,不执行的函数
bool judge; //判断函数是否已执行过

};

改写上述代码,在函数参数列表上增加一个参数,以A为例:

void funcA(...,FuncPathTree);

void funcA()
{
if (condition)
{
funcC(...,FuncPathTree->left); //若仍有函数调用则继续执行,直到左子树到底
} else {
funcD(...,FuncPath->right); //这里将不会执行(if不满足的情况)
}
... //这里保存一下funcC()需要的结果
...
//用judege去判断函数是否已执行,即调用过就将judege赋真,没调用就赋假
if(!(FuncPathTree->left)->judege){
funcC(...,FuncPathTree);
}
if(!(FuncPathTree->right)->judege){
funcD(...,FuncPathTree);
}
//为了记录未执行函数情况,可以在这里模拟一遍执行情况,修改参数等为临时值,防止对正常代码结果干扰,这里比较麻烦,视情况修改
...
}

这样是能考虑到if条件不满足的路径的,最后结果按需要格式遍历下二叉树然后输出就可以了。还可以用判断judege的值去需找该代码真正执行路径。若有不足请指教?效率应该还可以!