示例#1
0
 public override void VisitIssetEx(IssetEx x)
 {
     ConsumeToken(Tokens.T_ISSET, "isset", x.Span.Start);
     ConsumeToken(Tokens.T_LPAREN, "(");
     VisitElementList(x.VarList, Tokens.T_COMMA, ",");
     ConsumeToken(Tokens.T_RPAREN, ")");
 }
示例#2
0
        /// <inheritdoc />
        override public void VisitIssetEx(IssetEx x)
        {
            var varList = new List <VariableUse>(x.VarList.Count());

            foreach (VariableUse v in x.VarList)
            {
                VisitElement(v);
                varList.Add((VariableUse)result);
            }

            result = new IssetEx(x.Position, varList);
        }
示例#3
0
        public override void VisitIssetEx(IssetEx x)
        {
            var variables = new List <LValuePoint>();

            foreach (var varItem in x.VarList)
            {
                var lValue = CreateLValue(varItem);

                variables.Add(lValue);
            }

            Result(new IssetPoint(x, variables.ToArray()));
        }
示例#4
0
 /// <summary>
 /// Makes the assumption in case of <c>false</c> as a condition result.
 /// </summary>
 /// <param name="langElement">The language element to assume.</param>
 /// <param name="memoryContext">The memory context of the code block and it's variables.</param>
 /// <param name="flowOutputSet">The Output set of a program point.</param>
 private void AssumeFalse(LangElement langElement, MemoryContext memoryContext, FlowOutputSet flowOutputSet)
 {
     if (langElement is BinaryEx)
     {
         BinaryEx binaryExpression = (BinaryEx)langElement;
         if (binaryExpression.PublicOperation == Operations.Equal)
         {
             AssumeNotEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext);
         }
         else if (binaryExpression.PublicOperation == Operations.NotEqual)
         {
             AssumeEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext, flowOutputSet.Snapshot);
         }
         else if (binaryExpression.PublicOperation == Operations.GreaterThan)
         {
             AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
         }
         else if (binaryExpression.PublicOperation == Operations.GreaterThanOrEqual)
         {
             AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
         }
         else if (binaryExpression.PublicOperation == Operations.LessThan)
         {
             AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
         }
         else if (binaryExpression.PublicOperation == Operations.LessThanOrEqual)
         {
             AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
         }
     }
     else if (langElement is UnaryEx)
     {
         UnaryEx unaryExpression = (UnaryEx)langElement;
         if (unaryExpression.PublicOperation == Operations.LogicNegation)
         {
             AssumeTrue(unaryExpression.Expr, memoryContext, flowOutputSet);
         }
     }
     else if (langElement is VarLikeConstructUse)
     {
         var variableLikeUse = (VarLikeConstructUse)langElement;
         AssumeFalseElementUse(variableLikeUse, memoryContext, flowOutputSet.Snapshot);
     }
     else if (langElement is IssetEx)
     {
         IssetEx issetEx = (IssetEx)langElement;
         AssumeIsset(issetEx, memoryContext, flowOutputSet.Snapshot, false);
     }
 }
示例#5
0
 private void AssumeIsset(IssetEx issetEx, MemoryContext memoryContext, SnapshotBase flowOutputSet, bool assumeTrue)
 {
     foreach (var variable in issetEx.VarList)
     {
         if (variable is VarLikeConstructUse)
         {
             var varUse = (VarLikeConstructUse)variable;
             if (assumeTrue)
             {
                 memoryContext.RemoveUndefinedValue(varUse);
             }
             else
             {
                 memoryContext.AssignUndefinedValue(varUse);
             }
         }
     }
 }
示例#6
0
 void AssumeIsset(IssetEx issetEx, MemoryContext memoryContext, SnapshotBase flowOutputSet, bool assumeTrue)
 {
     foreach (var variable in issetEx.VarList)
     {
         if (variable is DirectVarUse)
         {
             var dirVariable = (DirectVarUse)variable;
             if (assumeTrue)
             {
                 memoryContext.RemoveUndefinedValue(dirVariable.VarName, dirVariable);
             }
             else
             {
                 memoryContext.AssignUndefinedValue(dirVariable.VarName);
             }
         }
     }
 }
示例#7
0
 /// <summary>
 /// Visit each VariableUse in isset variable list.
 /// </summary>
 /// <param name="x"></param>
 virtual public void VisitIssetEx(IssetEx x)
 {
     VisitList(x.VarList);
 }
示例#8
0
 override public void VisitIssetEx(IssetEx x)
 {
     _serializer.StartSerialize(typeof(IssetEx).Name, SerializeSpan(x.Span));
     base.VisitIssetEx(x);
     _serializer.EndSerialize();
 }
示例#9
0
 /// <inheritdoc />
 public override void VisitIssetEx(IssetEx x)
 {
     RValueResult(x);
 }
示例#10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="IssetPoint" /> class.
 /// </summary>
 /// <param name="isset"><c>isset</c> construct</param>
 /// <param name="variables">Variables to be checked whether they are not set and not NULL</param>
 internal IssetPoint(IssetEx isset, LValuePoint[] variables)
 {
     Isset      = isset;
     _variables = variables;
 }
示例#11
0
        /// <summary>
        /// Makes the assumption in case of <c>false</c> as a condition result.
        /// </summary>
        /// <param name="langElement">The language element to assume.</param>
        /// <param name="memoryContext">The memory context of the code block and it's variables.</param>
        /// <param name="flowOutputSet">The Output set of a program point.</param>
        void AssumeFalse(LangElement langElement, MemoryContext memoryContext, FlowOutputSet flowOutputSet)
        {
            if (langElement is BinaryEx)
            {
                BinaryEx binaryExpression = (BinaryEx)langElement;
                if (binaryExpression.PublicOperation == Operations.Equal)
                {
                    AssumeNotEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext);
                }
                else if (binaryExpression.PublicOperation == Operations.NotEqual)
                {
                    AssumeEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.GreaterThan)
                {
                    AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.GreaterThanOrEqual)
                {
                    AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.LessThan)
                {
                    AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.LessThanOrEqual)
                {
                    AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.And ||
                         binaryExpression.PublicOperation == Operations.Or ||
                         binaryExpression.PublicOperation == Operations.Xor)
                {
                    ConditionForm conditionForm = ConditionForm.SomeNot; // !(a AND b) --> !a OR !b
                    if (binaryExpression.PublicOperation == Operations.Or)
                    {
                        conditionForm = ConditionForm.None; // !(a OR b) --> !a AND !b
                    }
                    else if (binaryExpression.PublicOperation == Operations.Xor)
                    {
                        conditionForm = ConditionForm.NotExactlyOne; //!(a XOR b) --> !((a OR b) AND !(a AND b)) --> (!a AND !b) OR (a AND b)
                    }

                    MemoryContext  currentMemoryContext = new MemoryContext(log, flowOutputSet);
                    ConditionParts condition            = new ConditionParts(conditionForm, flowOutputSet, log, binaryExpression.LeftExpr, binaryExpression.RightExpr);
                    condition.MakeAssumption(currentMemoryContext);
                    memoryContext.UnionMerge(currentMemoryContext);
                }
            }
            else if (langElement is UnaryEx)
            {
                UnaryEx unaryExpression = (UnaryEx)langElement;
                if (unaryExpression.PublicOperation == Operations.LogicNegation)
                {
                    AssumeTrue(unaryExpression.Expr, memoryContext, flowOutputSet);
                }
            }
            else if (langElement is DirectVarUse)
            {
                DirectVarUse directVarUse = (DirectVarUse)langElement;
                AssumeFalseDirectVarUse(directVarUse, memoryContext, flowOutputSet.Snapshot);
            }
            else if (langElement is IssetEx)
            {
                IssetEx issetEx = (IssetEx)langElement;
                AssumeIsset(issetEx, memoryContext, flowOutputSet.Snapshot, false);
            }
        }
示例#12
0
        /// <summary>
        /// Makes the assumption in case of <c>true</c> as a condition result.
        /// </summary>
        /// <param name="langElement">The language element to assume.</param>
        /// <param name="memoryContext">The memory context of the code block and it's variables.</param>
        /// <param name="flowOutputSet">The Output set of a program point.</param>
        void AssumeTrue(LangElement langElement, MemoryContext memoryContext, FlowOutputSet flowOutputSet)
        {
            if (langElement is BinaryEx)
            {
                BinaryEx binaryExpression = (BinaryEx)langElement;
                if (binaryExpression.PublicOperation == Operations.Equal)
                {
                    AssumeEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.NotEqual)
                {
                    AssumeNotEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext);
                }
                else if (binaryExpression.PublicOperation == Operations.GreaterThan)
                {
                    AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.GreaterThanOrEqual)
                {
                    AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.LessThan)
                {
                    AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.LessThanOrEqual)
                {
                    AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.And ||
                         binaryExpression.PublicOperation == Operations.Or ||
                         binaryExpression.PublicOperation == Operations.Xor)
                {
                    ConditionForm conditionForm = ConditionForm.All;
                    if (binaryExpression.PublicOperation == Operations.Or)
                    {
                        conditionForm = ConditionForm.Some;
                    }
                    else if (binaryExpression.PublicOperation == Operations.Xor)
                    {
                        conditionForm = ConditionForm.ExactlyOne;
                    }

                    MemoryContext  currentMemoryContext = new MemoryContext(log, flowOutputSet);
                    ConditionParts condition            = new Weverca.Analysis.FlowResolver.Deprecated.ConditionParts(conditionForm, flowOutputSet, log, binaryExpression.LeftExpr, binaryExpression.RightExpr);
                    condition.MakeAssumption(currentMemoryContext);
                    memoryContext.UnionMerge(currentMemoryContext);
                }
            }
            else if (langElement is UnaryEx)
            {
                UnaryEx unaryExpression = (UnaryEx)langElement;
                if (unaryExpression.PublicOperation == Operations.LogicNegation)
                {
                    AssumeFalse(unaryExpression.Expr, memoryContext, flowOutputSet);
                }
            }
            else if (langElement is DirectVarUse)
            {
                DirectVarUse directVarUse = (DirectVarUse)langElement;
                AssumeTrueDirectVarUse(directVarUse, memoryContext, flowOutputSet.Snapshot);
            }
            else if (langElement is IssetEx)
            {
                IssetEx issetEx = (IssetEx)langElement;
                AssumeIsset(issetEx, memoryContext, flowOutputSet.Snapshot, true);
            }
        }
示例#13
0
 private static IssetExpression ToIssetExpression(IssetEx e)
 {
     return(new IssetExpression(ToCallSignature(e.VarList.Select(c => new CallParameter(Parse(c), ampersand: false, is_unpack: false)))));
 }