您好我想开发静态代码分析规则,以便局部变量不会在其外部作用域中隐藏名称。 你可以帮我识别if块/嵌套类,使用与其外部范围相同的名称。还有如何避免隐藏父类成员方法的方法。
请帮我创建一个算法,以便我可以开发静态代码分析规则。
答案 0 :(得分:1)
(编辑:OP最初并未明确目标语言)
假设Java,使用构建AST的Java解析器。实现以下算法:
for all Java source files F of interest
parse F
for all nodes N of F
if N is a "class declaration" for a class C
for all methods M under N
for all nodes m in M
if m is a declaration with name C
report "found " m " in " M " shadowing " C
endif
endfor
endfor
endif
endfor
endfor
这有点低效,因为它可能不止一次扫描一些子树。
命名空间使C#和C ++变得更加复杂。如果你想这样做 对于那些语言,我认为你需要一个完整的解析器以及名称解析(符号表)。 没有任何关于在这些语言中的“声明”下声明方法的方法, 所以简单的树搜索不会起作用。在那种情况下,你会 必须为命名空间声明添加额外的语法检查,并验证命名空间 通过检查符号表来引用声明的类。
对于C ++,您可以使用Clang或我们的C++ Front End。
我不确定你能为C#使用什么,因为你需要符号表。也许Mono为您提供了足够的访问权限,但我认为他们没有处理C#3.0或4.0。