stack-overflow - 使用 FxCop Introspection 进行代码分析的无限循环

标签 stack-overflow code-analysis fxcop cyclic-reference

我正在尝试编写自定义 FxCop 代码分析规则 这将警告开发人员不要使用包含太深嵌套代码块的方法, 并将敦促他们重构困惑局面。

例如。我正在努力避免以下情况:

if(condition)
{
   foreach(var item in items)
   {
       if(anotherCondition)
       {
           for(var product in item.Products)
           {
               // even more nested statement blocks...
           }
       }
   }
}

当我重写 VisitBlock(Block block) 方法时出现计算器溢出
计算 block 的深度,因为显然,有一个循环引用 从 block 的属性之一到 block 本身。 即对于某些 i 以下内容为真:block.Statements[i] == block

为什么会存在这样的循环引用?如何避免? 谢谢!

最佳答案

经过更多的研究,我发现我实际上有两个主要问题

  1. VisitXXX 方法不访问源代码的抽象语法树中的节点 但实际上访问生成的 IL 中的节点。只需比较每个方法生成的 IL 指令 以及每个 method.Body.
    生成的语句 我想知道如果 FxCop 我们能取得什么成就 可以为我们提供一个真正的 AST 访问者吗?
  2. 回答我最初的问题,防止开发人员编写过多的嵌套 代码块,我们应该自己扫描方法代码,我的意思是,取出method.BodySourceContext属性中的起始行和结束行,并保留每一个的轨道 '{' 和 '}' 我们找到了。 “{”的递增计数器和“}”的递减计数器。这应该行得通,对吧?

关于stack-overflow - 使用 FxCop Introspection 进行代码分析的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4951338/

相关文章:

linux - F# 代码在 REPL 中工作正常,但在编译期间出现堆栈溢出

java - 一个数组列表可以容纳多少个字符串?

.net - 如何配置 StyleCop 以抑制生成代码的警告?

c# - 为什么要使用 ICollection<T> 而不是 List<T>,如果我使用 ICollection<T>,那么如何使用 AddRange、Insert 和其他列表方法

c# - 我们可以为完整的解决方案创建一个 GlobalSuppression.cs 文件吗

c++ - 如何创建会抛出堆栈溢出异常的无限递归?

更改返回地址以指向 shellcode

msbuild - 是否可以在未安装 VS 的情况下从 MSBuild 命令行运行 FxCop 代码分析?

performance - 分析代码以提高效率?

c# - 从缓存获取对象时,代码试探性无法访问