public TranslatorContext(HashSet <Tuple <string, string> > ignoreMethods, bool _genInlineAttrInBpl)
 {
     Program                       = new BoogieProgram();
     ContractDefinitions           = new HashSet <ContractDefinition>();
     ASTNodeToSourcePathMap        = new Dictionary <ASTNode, string>();
     ASTNodeToSourceLineNumberMap  = new Dictionary <ASTNode, int>();
     ContractToSubTypesMap         = new Dictionary <ContractDefinition, HashSet <ContractDefinition> >();
     ContractToStateVarsMap        = new Dictionary <ContractDefinition, HashSet <VariableDeclaration> >();
     ContractToMappingsMap         = new Dictionary <ContractDefinition, HashSet <VariableDeclaration> >();
     ContractToArraysMap           = new Dictionary <ContractDefinition, HashSet <VariableDeclaration> >();
     StateVarToContractMap         = new Dictionary <VariableDeclaration, ContractDefinition>();
     ContractToConstructorMap      = new Dictionary <ContractDefinition, FunctionDefinition>();
     ContractToEventsMap           = new Dictionary <ContractDefinition, HashSet <EventDefinition> >();
     EventToContractMap            = new Dictionary <EventDefinition, ContractDefinition>();
     ContractToFunctionsMap        = new Dictionary <ContractDefinition, HashSet <FunctionDefinition> >();
     ContractToFuncSigsMap         = new Dictionary <ContractDefinition, HashSet <string> >();
     FunctionToContractMap         = new Dictionary <FunctionDefinition, ContractDefinition>();
     FuncSigResolutionMap          = new Dictionary <string, Dictionary <ContractDefinition, FunctionDefinition> >();
     ContractToVisibleFunctionsMap = new Dictionary <ContractDefinition, HashSet <FunctionDefinition> >();
     StateVarNameResolutionMap     = new Dictionary <string, Dictionary <ContractDefinition, VariableDeclaration> >();
     ContractToVisibleStateVarsMap = new Dictionary <ContractDefinition, HashSet <VariableDeclaration> >();
     ModifierToBoogiePreProc       = new Dictionary <string, BoogieProcedure>();
     ModifierToBoogiePostProc      = new Dictionary <string, BoogieProcedure>();
     ModifierToBoogiePreImpl       = new Dictionary <string, BoogieImplementation>();
     ModifierToBoogiePostImpl      = new Dictionary <string, BoogieImplementation>();
     IgnoreMethods                 = ignoreMethods;
     genInlineAttrInBpl            = _genInlineAttrInBpl;
 }
Exemple #2
0
 public TranslatorContext(AST solidityAST, HashSet <Tuple <string, string> > ignoreMethods, bool _genInlineAttrInBpl, TranslatorFlags _translateFlags = null, String entryPointContract = "")
 {
     Program                       = new BoogieProgram();
     ContractDefinitions           = new HashSet <ContractDefinition>();
     ASTNodeToSourcePathMap        = new Dictionary <ASTNode, string>();
     ASTNodeToSourceLineNumberMap  = new Dictionary <ASTNode, int>();
     ContractToSubTypesMap         = new Dictionary <ContractDefinition, HashSet <ContractDefinition> >();
     ContractToStateVarsMap        = new Dictionary <ContractDefinition, HashSet <VariableDeclaration> >();
     ContractToMappingsMap         = new Dictionary <ContractDefinition, HashSet <VariableDeclaration> >();
     ContractToArraysMap           = new Dictionary <ContractDefinition, HashSet <VariableDeclaration> >();
     StateVarToContractMap         = new Dictionary <VariableDeclaration, ContractDefinition>();
     ContractToConstructorMap      = new Dictionary <ContractDefinition, FunctionDefinition>();
     ContractToFallbackMap         = new Dictionary <ContractDefinition, FunctionDefinition>();
     ContractToEventsMap           = new Dictionary <ContractDefinition, HashSet <EventDefinition> >();
     EventToContractMap            = new Dictionary <EventDefinition, ContractDefinition>();
     ContractToFunctionsMap        = new Dictionary <ContractDefinition, HashSet <FunctionDefinition> >();
     ContractToFuncSigsMap         = new Dictionary <ContractDefinition, HashSet <string> >();
     FunctionToContractMap         = new Dictionary <FunctionDefinition, ContractDefinition>();
     FuncSigResolutionMap          = new Dictionary <string, Dictionary <ContractDefinition, FunctionDefinition> >();
     ContractToVisibleFunctionsMap = new Dictionary <ContractDefinition, HashSet <FunctionDefinition> >();
     StateVarNameResolutionMap     = new Dictionary <string, Dictionary <ContractDefinition, VariableDeclaration> >();
     ContractToVisibleStateVarsMap = new Dictionary <ContractDefinition, HashSet <VariableDeclaration> >();
     ModifierToBoogiePreProc       = new Dictionary <string, BoogieProcedure>();
     ModifierToBoogiePostProc      = new Dictionary <string, BoogieProcedure>();
     ModifierToBoogiePreImpl       = new Dictionary <string, BoogieImplementation>();
     ModifierToBoogiePostImpl      = new Dictionary <string, BoogieImplementation>();
     ModifierToPreludeLocalVars    = new Dictionary <string, List <BoogieLocalVariable> >();
     usingMap                      = new Dictionary <ContractDefinition, Dictionary <UserDefinedTypeName, List <TypeName> > >();
     IgnoreMethods                 = ignoreMethods;
     genInlineAttrInBpl            = _genInlineAttrInBpl;
     TranslateFlags                = _translateFlags;
     EntryPointContract            = entryPointContract;
     Analysis                      = new SolidityAnalyzer(solidityAST, ignoreMethods, entryPointContract);
     initFns                       = new HashSet <String>();
 }
Exemple #3
0
        //ignored methods and translate flags not used, intended for implementation however timeconstraints prohibited this.
        //Parameter based constructor.
        public AST_Handler(HashSet <Tuple <string, string> > ignoreMethods, bool _genInlineAttrInBpl, Flags_HelperClass translateFlags = null)
        {
            //returns boogie program instance containing the building blocks for boogie statements.
            //Initially this property is populated with default Boogie Statements as per expectation of the Boogie veriifer.

            //The process handler then aids in conversion to boogie by providing Boogie alternatives to the soldiity constructs contained within each mapping.
            getProgram = new BoogieProgram();
            //generates the mappings for the AST_hander, used to filter the generic AST properties into categorizable subsections
            instantiateMappings();

            IgnoreMethods      = ignoreMethods;
            genInlineAttrInBpl = _genInlineAttrInBpl; // set by default to true;
            TranslateFlags     = translateFlags;      //Not used
        }
Exemple #4
0
        public void PerformModSetAnalysis()
        {
            BoogieProgram prog = context.Program;

            List <BoogieImplementation> impls = new List <BoogieImplementation>();
            Dictionary <string, BoogieGlobalVariable> globals    = new Dictionary <string, BoogieGlobalVariable>();
            Dictionary <string, BoogieProcedure>      procedures = new Dictionary <string, BoogieProcedure>();

            foreach (var decl in prog.Declarations)
            {
                if (decl is BoogieImplementation)
                {
                    impls.Add((BoogieImplementation)decl);
                }
                else if (decl is BoogieProcedure)
                {
                    BoogieProcedure proc = (BoogieProcedure)decl;
                    procedures.Add(proc.Name, proc);
                }
                else if (decl is BoogieGlobalVariable)
                {
                    var globalVar = (BoogieGlobalVariable)decl;
                    globals.Add(globalVar.Name, globalVar);
                }
            }

            calculateFlattenCmdLists(impls);

            foreach (var impl in impls)
            {
                HashSet <BoogieGlobalVariable> modSet = new HashSet <BoogieGlobalVariable>();
                modSets.Add(impl.Name, modSet);

                foreach (var stmt in flattenedCmdLists[impl.Name])
                {
                    switch (stmt)
                    {
                    case BoogieHavocCmd havoc:
                        foreach (var identifier in havoc.Vars)
                        {
                            var idName = identifier.Name;
                            if (globals.ContainsKey(idName))
                            {
                                modSet.Add(globals[idName]);
                            }
                        }
                        break;

                    case BoogieAssignCmd assign:
                        switch (assign.Lhs)
                        {
                        case BoogieIdentifierExpr idExpr:
                        {
                            var idName = idExpr.Name;
                            if (globals.ContainsKey(idName))
                            {
                                modSet.Add(globals[idName]);
                            }
                            break;
                        }

                        case BoogieMapSelect mapSelect:
                        {
                            var idName = findOutermostIdentifierExpr(mapSelect).Name;
                            if (globals.ContainsKey(idName))
                            {
                                modSet.Add(globals[idName]);
                            }
                            break;
                        }

                        default:
                            throw new RuntimeWrappedException("unexpected LHS");
                        }
                        break;
                    }
                }
            }

            bool modSetChange;

            do
            {
                modSetChange = false;

                foreach (var impl in impls)
                {
                    HashSet <BoogieGlobalVariable> currModSet = modSets[impl.Name];
                    int oldSize = currModSet.Count;
                    foreach (var stmt in flattenedCmdLists[impl.Name])
                    {
                        if (stmt is BoogieCallCmd)
                        {
                            BoogieCallCmd callCmd = (BoogieCallCmd)stmt;

                            if (modSets.ContainsKey(callCmd.Callee))
                            {
                                currModSet.UnionWith(modSets[callCmd.Callee]);
                            }
                        }
                    }

                    if (currModSet.Count > oldSize)
                    {
                        modSetChange = true;
                    }
                }
            } while (modSetChange);

            foreach (var impl in impls)
            {
                procedures[impl.Name].ModSet = modSets[impl.Name].ToList();
            }
        }