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; }
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>(); }
//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 }
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(); } }