首页 新闻 会员 周边

如何检查程序中的递归方法?

0
悬赏园豆:5 [待解决问题]

由于工程较大,代码文件过多,所以希望用代码查找出源代码中使用了递归的方法?

▄︻┻┳═一的主页 ▄︻┻┳═一 | 菜鸟二级 | 园豆:224
提问于:2017-04-17 11:55
< >
分享
所有回答(3)
0

用正则表达式,查询方法名中包含相同方法名的规则

poplau | 园豆:59 (初学一级) | 2017-04-17 13:16

正则不太熟,也没有查到相关信息,希望给出详细方法,谢谢

支持(0) 反对(0) ▄︻┻┳═一 | 园豆:224 (菜鸟二级) | 2017-04-17 13:56
0

用代码查找代码. 其实就是查找文本了. 思路,仅供参考;

1. 检查的单元项就是函数.

2. 基于不同的编程语言, 函数的定义有各自的特征; return_Type FunctionName(...){...}

这就是一个函数;

3. 在函数体内, 查找函数名字符串, 这样,基本可以过滤很多了. 就像一楼说的.

难点在函数域的确定.

[0] | 园豆:1257 (小虾三级) | 2017-04-17 14:56

用正则, 我觉得会好一些. 也就是搜索出 ...空格...(...){...} 这样格式的字符串.

支持(0) 反对(0) [0] | 园豆:1257 (小虾三级) | 2017-04-17 14:58

是不是可以在一些第三方的小型编译器里面会容易确定函数域

支持(0) 反对(0) ▄︻┻┳═一 | 园豆:224 (菜鸟二级) | 2017-04-17 15:02
0

已解决:

1.引用Mono.Cecil.Dll

2.

const string AssemblyFilePath = @"path\to\assembly.dll"; void Main() { var assembly = ModuleDefinition.ReadModule(AssemblyFilePath); var calls = (from type in assembly.Types from caller in type.Methods where caller != null && caller.Body != null from instruction in caller.Body.Instructions where instruction.OpCode == OpCodes.Call let callee = instruction.Operand as MethodReference select new { type, caller, callee }).Distinct(); var directRecursiveCalls = from call in calls where call.callee == call.caller select call.caller; foreach (var method in directRecursiveCalls) Debug.WriteLine(method.DeclaringType.Namespace + "." + method.DeclaringType.Name + "." + method.Name + " calls itself"); }

▄︻┻┳═一 | 园豆:224 (菜鸟二级) | 2017-04-21 10:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册