我最近开始使用Roslyn提供的数据流分析API,发现在WrittenInside字段和Locations字段中显示的值有点模棱两可。

考虑以下Main方法中的代码段

1. int[] lcolSample = new int[10] { 0, 1, 2, 3, 4, 0, 1, 2, 3, 4};
2. for (int lintCount1 = 0; lintCount1 < 10; lintCount1++)
3. {
4.     Prog1(lintCount1);
5.     int[] lcolSample1 = new int[10] { 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 };
6.     lintCount3 = lintCount3 + 100;
7.     lintCount1 = lintCount1 + 2;
8.     lcolSample[lintCount1-1] = lcolSample1[lintCount1] + 100;
9. }
  • 如果我在for循环节点上执行DFA,则所得的数据流分析对象将永远不会在WrittenInside字段中将lcolSample []显示为for循环内部写入的符号。原因是在执行数据流分析的节点外部声明了它。但是,ReadInside字段显示此符号。即使在执行DFA的节点之外声明了所有在给定节点内修改/写入的符号,是否有办法知道它们?
  • 变量lintCount1被写入两次(语句2和7)并读取两次。 lintCount1上的Locations属性仅显示声明它的位置(语句2)。有没有办法找到lintCount1写入的所有位置?查找该符号的所有引用将给出使用该符号的所有位置,但是我需要将其写入但不能读取的位置。

  • 这是我在这个论坛上的第一个问题。如果以上提供的信息不足,请询问其他详细信息。提前致谢..

    最佳答案



    是的,因为该符号未写在循环内部(即那里没有lcolSample = whatever)。由lcolSample符号表示的数组元素被写入循环中,这是非常不同的。我不知道如何使用Roslyn的数据流分析来找到此类写入。


    DataFlowAnalysis对象仅为您提供符号,访问它们的Location并没有多大意义(因为该位置与数据流分析无关)。

    对我来说,您的两个问题听起来都像是合理的功能要求,您可能希望将它们设置为on the Roslyn repo

    关于c# - Roslyn数据流分析-WrittenInside和Locations字段的值不明确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25629159/

    10-13 03:30