【问题标题】:Roslyn : get instructions from a basicblockRoslyn:从基本块获取指令
【发布时间】:2019-08-10 08:49:34
【问题描述】:

roslyn中生成的控制流图包含块(basicblock)作为节点,每个basicblock包含一条或多条指令。对于包含多个指令的基本块,我尝试获取所有指令及其类型,这就是我所做的:

var cfg = ControlFlowGraph.Create(method);
foreach(var block in cfg.Blocks)
{
    foreach(var operation in block.Operations)
    {
        var syntax = operation.Syntax;
        Console.WriteLine(syntax.Kind());
    }
}

以下方法:

public int method(int x, int y)
{
y = 10;
x = y;
return x + y;
}

我得到了结果:

ExpressionStatement
ExpressionStatement

但我想获得确切的指令,例如指令x = y; 的类型我想获得AssignmentExpressionSyntax。 我还想根据指令的类型对每条指令执行一些操作。

【问题讨论】:

    标签: c# roslyn roslyn-code-analysis control-flow-graph


    【解决方案1】:

    由于您正在查看语法类型,因此 ExpressionStatement 是语句的正确类型。您可以通过查看 ExpressionStatement 中表达式的种类来找到表达式的种类。

    if (operation.Syntax is ExpressionStatement es)
    {
        var kind = es.Expression.Kind();
    }
    

    但是,如果您使用的是操作 (IOperation),那么您可能会通过跳过语法并使用 OperationKind 来获得更好的信息。

    【讨论】:

    • 这是我一直在寻找的答案,我只是将 ExpressionStatement 更改为 ExpressionStatementSyntax
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多