c# - 如何识别与其父/容器类同名的局部变量

标签 c# code-analysis

您好,我想开发静态代码分析规则,以便局部变量不会在其外部范围内隐藏名称。 你能帮我识别使用与其外部范围内相同名称的 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/

相关文章:

c# - 在 C# 中绘制图表时避免空值

c# - 从 Java/C# 的角度理解 C++ 编译器

c# - 将多个类型组合成一个字节数组

java - PMD的StringInstantiation规则背后的 "Why"

c# - 启用 Microsoft 对 .NET Core 项目的代码分析

c# - LINQ .ToList() 在单个结果上失败

c# - CaSTLe.Windsor 生活方式取决于上下文?

version-control - 各个代码部分的 TFS 2010 更改历史记录

c# - 查找 "Dead code"

c++ - 您是否推荐在构建时为 C/C++ 启用代码分析?