Example #1
0
        private IADomain ReadTransfer(ReadStmt readStmt, IADomain domain)
        {
            var newDomain = CopyDomain(domain);

            if (domain.IsBottom())
            {
                return(newDomain);
            }

            var ident = readStmt.Left switch
            {
                VarAccess varAccess => varAccess.Left,
                ArrayAccess arrayAccess => arrayAccess.Left,
                RecordAccess recordAccess => recordAccess.Right,
            };

            if (readStmt.Left is ArrayAccess)
            {
                var ra            = readStmt.Left as ArrayAccess;
                var indexInterval = IAUtil.Arithmetic(ra.Right, domain);
                if (indexInterval.IsBottom)
                {
                    return(Bottom().GetDomain());
                }
            }

            newDomain[ident] = new Interval(ExtendedZ.NegativeInfinity(), ExtendedZ.PositiveInfinity()).ToIntervalK(_program);
            return(newDomain);
        }
        public override IAstNode VisitReadStmt(MicroCParser.ReadStmtContext context)
        {
            var          label    = ++_label;
            string       name     = context.IDENT().GetText();
            var          symbol   = _symbolTable.LookupSymbol(name);
            var          ident    = new Identifier(symbol.Name, symbol.Type, symbol.Id);
            IStateAccess sa       = new VarAccess(ident);
            var          readStmt = new ReadStmt(sa);

            readStmt.Label = label;
            return(readStmt);
        }
Example #3
0
        private void BuildAssignment(Assignment node, VarAccess varAccess)
        {
            var varDef = GetVarDefinition(varAccess);

            node.RightOperand.Accept(this);

            if (!node.IsStatementExpression)
            {
                _emitter.Emit(OpCodes.Dup);
            }

            _emitter.Emit(OpCodes.Stloc, varDef);
        }
Example #4
0
        private IADomain AssignTransfer(AssignStmt assignStmt, IADomain domain)
        {
            var newDomain = CopyDomain(domain);

            if (domain.IsBottom())
            {
                return(newDomain);
            }

            var ident = assignStmt.Left switch
            {
                VarAccess varAccess => varAccess.Left,
                ArrayAccess arrayAccess => arrayAccess.Left,
                RecordAccess recordAccess => recordAccess.Right,
            };

            var newValue = assignStmt.Left switch
            {
                VarAccess varAccess => IAUtil.Arithmetic(assignStmt.Right, domain),
                RecordAccess recordAccess => IAUtil.Arithmetic(assignStmt.Right, domain),
                ArrayAccess arrayAccess => IAUtil.Arithmetic(assignStmt.Right, domain)
                .Join(domain[ident]),
                //.Join(IAUtil.Arithmetic(arrayAccess.Right, domain)),
            };

            if (assignStmt.Left is ArrayAccess)
            {
                var ra            = assignStmt.Left as ArrayAccess;
                var indexInterval = IAUtil.Arithmetic(ra.Right, domain);
                if (indexInterval.IsBottom)
                {
                    return(Bottom().GetDomain());
                }

                var arrayIndices = new Interval(new ExtendedZ(0), new ExtendedZ(ra.Left.Size - 1));
                var meet         = indexInterval.Meet(arrayIndices);
                if (indexInterval.Meet(arrayIndices).IsBottom)
                {
                    return(Bottom().GetDomain());
                }
            }

            if (newValue.IsBottom)
            {
                return(Bottom().GetDomain());
            }

            newDomain[ident] = newValue.ToIntervalK(_program);
            return(newDomain);
        }
Example #5
0
        public VarDecl(Block block, Token id, TypeSpec typeSpec, VarAccess accessType)
        {
            if (block.FindVar(new VarExpr(block, id), throws: false) != null)
            {
                CName = "x" + block.Vars[id.Text].CName;
            }
            else
            {
                CName = Compiler.Prefix + id.Text;
            }

            Block      = block;
            Id         = id;
            TypeSpec   = typeSpec;
            AccessType = accessType;
        }
        public override IAstNode VisitAssignStmt(MicroCParser.AssignStmtContext context)
        {
            var label  = ++_label;
            var name   = context.IDENT().GetText();
            var symbol = _symbolTable.LookupSymbol(name);
            var ident  = new Identifier(name, symbol.Type, symbol.Id);
            // TODO: Type check the symbol

            VarAccess left  = new VarAccess(ident);
            IAExpr    right = Visit(context.a_expr()) as IAExpr;

            var assignStmt = new AssignStmt(left, right);

            assignStmt.Label = label;
            return(assignStmt);
        }
Example #7
0
        private DSDomain ReadTransfer(ReadStmt readStmt, DSDomain domain)
        {
            var ident = readStmt.Left switch
            {
                VarAccess varAccess => varAccess.Left,
                ArrayAccess arrayAccess => arrayAccess.Left,
                RecordAccess recordAccess => recordAccess.Right,
            };

            var newDomain = CopyDomain(domain);

            newDomain[ident] = new HashSet <DSSign>()
            {
                DSSign.Negative, DSSign.Positive, DSSign.Zero
            };
            return(newDomain);
        }
Example #8
0
        private FVDomain ReadTransfer(ReadStmt readStmt, FVDomain domain)
        {
            var ident = readStmt.Left switch
            {
                VarAccess varAccess => varAccess.Left,
                ArrayAccess arrayAccess => arrayAccess.Left,
                RecordAccess recordAccess => recordAccess.Right,
            };

            if (!domain.Contains(ident))
            {
                return(domain);
            }

            return(readStmt.Left switch
            {
                ArrayAccess arrayAccess => domain.Union(AnalysisUtil.FreeVariables(arrayAccess.Right)).ToFVDomain(),
                _ => domain.Except(ident.Singleton()).ToFVDomain(),
            });
Example #9
0
        private DSDomain AssignTransfer(AssignStmt assignStmt, DSDomain domain)
        {
            var ident = assignStmt.Left switch
            {
                VarAccess varAccess => varAccess.Left,
                ArrayAccess arrayAccess => arrayAccess.Left,
                RecordAccess recordAccess => recordAccess.Right,
            };

            var newDomain = CopyDomain(domain);

            var newValue = assignStmt.Left switch
            {
                VarAccess varAccess => DSUtil.Arithmetic(assignStmt.Right, domain),
                RecordAccess recordAccess => DSUtil.Arithmetic(assignStmt.Right, domain),
                ArrayAccess arrayAccess => DSUtil.Arithmetic(assignStmt.Right, domain)
                .Union(domain[ident])
                //.Union(DSUtil.Arithmetic(arrayAccess.Right, domain)),
            };

            newDomain[ident] = newValue.ToHashSet();
            return(newDomain);
        }
Example #10
0
        private FVDomain AssignTransfer(AssignStmt assignStmt, FVDomain domain)
        {
            var ident = assignStmt.Left switch
            {
                VarAccess varAccess => varAccess.Left,
                ArrayAccess arrayAccess => arrayAccess.Left,
                RecordAccess recordAccess => recordAccess.Right,
            };

            if (!domain.Contains(ident))
            {
                return(domain);
            }

            var fv  = AnalysisUtil.FreeVariables(assignStmt.Right);
            var fv2 = assignStmt.Left switch
            {
                ArrayAccess arrayAccess => AnalysisUtil.FreeVariables(arrayAccess.Right),
                _ => new HashSet <Identifier>(),
            };
            var freeVariables = fv.Union(fv2);

            return(domain.Except(ident.Singleton()).Union(freeVariables).ToFVDomain());
        }
Example #11
0
 public void VisitVarAccess(VarAccess node) => InferSimpleType(node.GetVarDeclaration().Type);
Example #12
0
        private VariableDefinition GetVarDefinition(VarAccess varAccess)
        {
            var declaration = varAccess.GetVarDeclaration();

            return(GetVarDefinition(declaration));
        }
Example #13
0
        public void VisitVarAccess(VarAccess node)
        {
            var varDef = GetVarDefinition(node);

            _emitter.Emit(OpCodes.Ldloc, varDef);
        }