您好,我想开发静态代码分析规则,以便局部变量不会在其外部范围内隐藏名称。 你能帮我识别使用与其外部范围内相同名称的 if block /嵌套类吗?以及如何避免父成员方法的方法隐藏。
请帮我创建一个算法,以便我可以开发静态代码分析规则。
最佳答案
(编辑: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。
关于c# - 如何识别与其父/容器类同名的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5577463/