Example #1
0
		public void Count ()
		{
			Bitmask<long> x = new Bitmask<long> ();
			Assert.AreEqual (0, x.Count (), "0");
			x.SetAll ();
			Assert.AreEqual (64, x.Count (), "64");
			for (int i = 63; i >= 0; i--) {
				x.Clear (i);
				Assert.AreEqual (i, x.Count (), i.ToString ());
			}
		}
        public void Count()
        {
            Bitmask <long> x = new Bitmask <long> ();

            Assert.AreEqual(0, x.Count(), "0");
            x.SetAll();
            Assert.AreEqual(64, x.Count(), "64");
            for (int i = 63; i >= 0; i--)
            {
                x.Clear(i);
                Assert.AreEqual(i, x.Count(), i.ToString());
            }
        }
        public RuleResult CheckMethod(MethodDefinition method)
        {
            // p/invoke, abstract methods and method without parameters
            if (!method.HasBody || !method.HasParameters || !method.IsVisible())
            {
                return(RuleResult.DoesNotApply);
            }

            has_null_check.ClearAll();
            int parameters = method.Parameters.Count;

            // check
            foreach (Instruction ins in method.Body.Instructions)
            {
                if (ins.IsLoadArgument())
                {
                    CheckArgument(method, ins);
                }
                else if (OpCodeBitmask.Calls.Get(ins.OpCode.Code))
                {
                    CheckCall(method, ins);
                }
                else if (check.Get(ins.OpCode.Code))
                {
                    Instruction owner = ins;
                    // fields (no need to check static fields), ldind, ldelem, ldlen
                    while ((owner != null) && check.Get(owner.OpCode.Code))
                    {
                        owner = owner.TraceBack(method);
                    }
                    CheckParameter(owner.GetParameter(method));
                }

                // stop processing instructions once all parameters are validated
                if (has_null_check.Count() == parameters)
                {
                    break;
                }
            }

            return(Runner.CurrentRuleResult);
        }