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, ")"); }
/// <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); }
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())); }
/// <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); } }
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); } } } }
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); } } } }
/// <summary> /// Visit each VariableUse in isset variable list. /// </summary> /// <param name="x"></param> virtual public void VisitIssetEx(IssetEx x) { VisitList(x.VarList); }
override public void VisitIssetEx(IssetEx x) { _serializer.StartSerialize(typeof(IssetEx).Name, SerializeSpan(x.Span)); base.VisitIssetEx(x); _serializer.EndSerialize(); }
/// <inheritdoc /> public override void VisitIssetEx(IssetEx x) { RValueResult(x); }
/// <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; }
/// <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); } }
/// <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); } }
private static IssetExpression ToIssetExpression(IssetEx e) { return(new IssetExpression(ToCallSignature(e.VarList.Select(c => new CallParameter(Parse(c), ampersand: false, is_unpack: false))))); }