コード例 #1
0
        public void Annotation_NotEntryMethod_AttibutesAreIgnored()
        {
            const string code = @"
namespace Namespace
{
    public class FromBodyAttribute : System.Attribute { }

    public class NotAController
    {
        public object Foo([FromBody] long itemId, [FromBody] string itemId2)
        {
            var data = itemId;
                // data := __id [ const ]
            var data = itemId2;
                // data := __id [ itemId2 ]
            return null;
        }
    }
}";
            var          ucfg = UcfgVerifier.VerifyInstructions(code, "Foo");

            var entryPoints = UcfgVerifier.GetEntryPointInstructions(ucfg);

            entryPoints.Count.Should().Be(0);
        }
コード例 #2
0
        public void Annotation_EntryMethod_AttributeOnStringParameterIsHandled()
        {
            const string code = @"
namespace Namespace
{
    using System.Web.Mvc;

    public class FromBodyAttribute : System.Attribute { }

    public class CartController : Controller
    {
        public object Remove([FromBody] string itemId)
        {
            var data = itemId;
                // data := __id [ itemId ]
                // %0 := __entrypoint [ itemId ]
                // %1 := __annotate [ Namespace.FromBodyAttribute.FromBodyAttribute() itemId ]
                // itemId := __annotation [ %1 ]

            return null;
        }
    }
}";
            var          ucfg = UcfgVerifier.VerifyInstructions(code, "Remove");

            var entryPoints = UcfgVerifier.GetEntryPointInstructions(ucfg);

            entryPoints.Count.Should().Be(1);

            // Entry point location should be the "Remove" token.
            // Line numbers are 1-based, offsets are 0-based
            var actualLocation = entryPoints[0].Assigncall.Location;

            actualLocation.StartLine.Should().Be(10);
            actualLocation.EndLine.Should().Be(10);
            actualLocation.StartLineOffset.Should().Be(22);
            actualLocation.EndLineOffset.Should().Be(28);
        }
コード例 #3
0
        public void ControllerMethod_Contains_EntryPoint_And_Attributes()
        {
            const string code = @"
using System.ComponentModel;
using System.Web.Mvc;
public class Class1 : Controller
{
    public class DummyAttribute : System.Attribute { }

    private string field;
    [HttpPost] // should be ignored
    public void Foo([Description]string s, [Missing]string x,
                    [Dummy] int i, [DummyAttribute]string s2) {}
        // %0 := __entrypoint [ s x const s2 ]
        // %1 := __annotate [ System.ComponentModel.DescriptionAttribute.DescriptionAttribute() s ]
        // s := __annotation [ %1 ]
        // i is a const so the attribute is ignored
        // the Missing attribute is unknown and is not included
        // %2 := __annotate [ Class1.DummyAttribute.DummyAttribute() s2 ]
        // s2 := __annotation [ %2 ]
}";
            var          ucfg = UcfgVerifier.VerifyInstructions(code, "Foo");

            var entryPoints = UcfgVerifier.GetEntryPointInstructions(ucfg);

            entryPoints.Count.Should().Be(1);

            // Entry point location should be the "Foo" token.
            // Line numbers are 1-based, offsets are 0-based
            var actualLocation = entryPoints[0].Assigncall.Location;

            actualLocation.StartLine.Should().Be(10);
            actualLocation.EndLine.Should().Be(10);
            actualLocation.StartLineOffset.Should().Be(16);
            actualLocation.EndLineOffset.Should().Be(19);
        }