示例#1
0
        private void WriteUCFG <TDeclarationSyntax>(SyntaxNodeAnalysisContext context, Func <TDeclarationSyntax, CSharpSyntaxNode> getBody)
            where TDeclarationSyntax : SyntaxNode
        {
            var declaration = (TDeclarationSyntax)context.Node;

            var symbol = context.SemanticModel.GetDeclaredSymbol(declaration);

            var methodSymbol = (symbol is IPropertySymbol propertySymbol)
                ? propertySymbol.GetMethod // We are in PropertyDeclarationSyntax
                : symbol as IMethodSymbol; // all other are methods

            if (methodSymbol == null ||
                methodSymbol.IsAbstract ||
                methodSymbol.IsExtern ||
                !CSharpControlFlowGraph.TryGet(getBody(declaration), context.SemanticModel, out var cfg))
            {
                return;
            }

            var ucfg = new UcfgFactory(context.SemanticModel)
                       .Create(declaration, methodSymbol, cfg);

            if (IsValid(ucfg))
            {
                var fileName = $"{projectBuildId}_{Interlocked.Increment(ref protobufFileIndex)}";

                WriteProtobuf(ucfg, Path.Combine(protobufDirectory, $"ucfg_{fileName}.pb"));

                if (ShouldGenerateDot)
                {
                    WriteDot(Path.Combine(protobufDirectory, $"ucfg_{fileName}.dot"), writer => UcfgSerializer.Serialize(ucfg, writer));
                    WriteDot(Path.Combine(protobufDirectory, $"cfg_{fileName}.dot"), writer => CfgSerializer.Serialize(ucfg.MethodId, cfg, writer));
                }
            }
        }
        public void Create_DecoratesAndReThrowsExceptions()
        {
            // Arrange
            const string code = @"
namespace Ns1
{
  class MyClass
  {
    void DoStuff(){}
  }
}
";

            var(syntaxTree, semanticModel) = TestHelper.Compile(code);
            var factory = new UcfgFactory(semanticModel);

            var methodNode = syntaxTree.GetRoot()
                             .DescendantNodes()
                             .OfType <MethodDeclarationSyntax>()
                             .First();
            var methodSymbol = (IMethodSymbol)semanticModel.GetDeclaredSymbol(methodNode);

            var mockCFG = new Mock <IControlFlowGraph>(MockBehavior.Strict); // strict -> throw on any usage

            Action act = () => factory.Create(methodNode, methodSymbol, mockCFG.Object);

            // Act
            act.Should().ThrowExactly <UcfgException>().And.Message.Should().ContainAll("Error processing method: DoStuff", "Inner exception: ");
        }
示例#3
0
        private static UCFG BuildUcfg(CSharpSyntaxNode cfgStartNode, CSharpSyntaxNode ucfgStartNode,
                                      IMethodSymbol methodSymbol, SemanticModel semanticModel)
        {
            var builder = new UcfgFactory(semanticModel);
            var cfg     = CSharpControlFlowGraph.Create(cfgStartNode, semanticModel);
            var ucfg    = builder.Create(ucfgStartNode, methodSymbol, cfg);

            //var serializedCfg = CfgSerializer.Serialize(methodName, cfg);
            //var serializedUcfg = UcfgSerializer.Serialize(ucfg);

            return(ucfg);
        }