/** * Starts and execute the ImmediateChecksParser for parsing those Variables/functions that should * be checked for security violation at every state. * * @param pFile the file to be parsed. */ @SuppressWarnings("resource") public ImmediateChecksParser(LogManager pLogger, Path pFile) { set = new TreeSet<>(); List<String> contents = null; try { contents = Files.readAllLines(pFile, Charset.defaultCharset()); } catch (IOException e) { pLogger.logUserException( Level.WARNING, e, "Could not read intial security mapping from file named " + pFile); return; } for (String strLine : contents) { if (strLine.trim().isEmpty()) { continue; } else if (strLine.contains(";")) { int sem = strLine.indexOf(";"); Variable var = new Variable(strLine.substring(0, sem)); if (!set.contains(var)) { set.add(var); } } } }
/** * This method exports the current representation in dot format to the given file. * * @param file file the file to write to */ public void exportToDot(PathTemplate file, int refinementCounter) { StringBuilder result = new StringBuilder().append("digraph tree {" + "\n"); for (Map.Entry<ARGState, ARGState> current : successorRelation.entries()) { if (interpolants.containsKey(current.getKey())) { StringBuilder sb = new StringBuilder(); sb.append("itp is " + interpolants.get(current.getKey())); result.append( current.getKey().getStateId() + " [label=\"" + (current.getKey().getStateId() + " / " + AbstractStates.extractLocation(current.getKey())) + " has itp " + (sb.toString()) + "\"]" + "\n"); result.append( current.getKey().getStateId() + " -> " + current.getValue().getStateId() + "\n"); // + " [label=\"" + // current.getKey().getEdgeToChild(current.getValue()).getRawStatement().replace("\n", "") + "\"]\n"); } else { result.append( current.getKey().getStateId() + " [label=\"" + current.getKey().getStateId() + " has itp NA\"]" + "\n"); result.append( current.getKey().getStateId() + " -> " + current.getValue().getStateId() + "\n"); // + " [label=\"" + // current.getKey().getEdgeToChild(current.getValue()).getRawStatement().replace("\n", "") + "\"]\n"); } if (current.getValue().isTarget()) { result.append( current.getValue().getStateId() + " [style=filled, fillcolor=\"red\"]" + "\n"); } assert (!current.getKey().isTarget()); } result.append("}"); try { MoreFiles.writeFile( file.getPath(refinementCounter, interpolationCounter), Charset.defaultCharset(), result); } catch (IOException e) { logger.logUserException(Level.WARNING, e, "Could not write interpolation tree to file"); } }
@SuppressWarnings("unchecked") @Override public void printStatistics(PrintStream out, Result result, ReachedSet reached) { StatisticsData statistics; if (cpa.isAnalysis()) { statistics = cpa.getFactory().getGlobalAnalysis(); } else { StatisticsState lastState = (StatisticsState) reached.getLastState(); if (lastState == null) { for (AbstractState abstractState : reached.asCollection()) { if (abstractState != null) { lastState = (StatisticsState) reached.getLastState(); } } } statistics = lastState.getStatistics(); } Map<String, Object> jsonMap = new HashMap<>(); for (Entry<StatisticsProvider, StatisticsDataProvider> entry : statistics) { StatisticsProvider provider = entry.getKey(); StatisticsDataProvider data = entry.getValue(); String propName = provider.getPropertyName(); Object value = data.getPropertyValue(); String mergeInfo = ""; if (!cpa.isAnalysis()) { String mergeType = provider.getMergeType(); mergeInfo = "_" + mergeType; // Save in json with merge type Map<String, Object> innerJsonMap; if (jsonMap.containsKey(propName)) { innerJsonMap = (Map<String, Object>) jsonMap.get(propName); } else { innerJsonMap = new HashMap<>(); jsonMap.put(propName, innerJsonMap); } innerJsonMap.put(mergeType, value); } else { // Save in json without merge type jsonMap.put(propName, value); } out.println("\t" + propName + mergeInfo + ": " + value); } if (statisticsCPAFile != null) { try { JSON.writeJSONString(jsonMap, statisticsCPAFile); } catch (IOException e) { logger.logUserException(Level.WARNING, e, "Could not write statistics to file"); } } }
@Override public AlgorithmStatus run(ReachedSet pReached) throws CPAException, InterruptedException { checkArgument( pReached instanceof ForwardingReachedSet, "RestartAlgorithm needs ForwardingReachedSet"); ForwardingReachedSet reached = (ForwardingReachedSet) pReached; CFANode mainFunction = AbstractStates.extractLocation(pReached.getFirstState()); assert mainFunction != null : "Location information needed"; AlgorithmStatus status = AlgorithmStatus.UNSOUND_AND_PRECISE; try { ReachedSetFactory reachedSetFactory = new ReachedSetFactory(globalConfig); // predicate analysis logger.log(Level.FINE, "Creating CPA for PredicateAnalysis"); Configuration singleConfig1 = getConfigFromFile(configFiles.get(0)); ConfigurableProgramAnalysis cpa1 = getCPA(reachedSetFactory, singleConfig1); Algorithm algorithm1 = getAlgorithm(shutdownNotifier, singleConfig1, logger, cpa1); ReachedSet reached1 = createInitialReachedSetForRestart(cpa1, mainFunction, singleConfig1, logger); reached.setDelegate(reached1); stats.noOfAlgorithmsUsed++; stats.totalTime.start(); status = run0(reached1, algorithm1); // stats.printIntermediateStatistics(System.out, Result.UNKNOWN, reached); // disabled, // because table-generator can not distinguish 1st and 2nd statistics. stats.resetSubStatistics(); // predicate bit-precise analysis logger.log(Level.FINE, "Creating CPA for PredicateAnalysis-Bitprecise"); Configuration singleConfig2 = getConfigFromFile(configFiles.get(1)); ConfigurableProgramAnalysis cpa2 = getCPA(reachedSetFactory, singleConfig2); { // this is the important step: re-use the reached-set ARGReplayCPA argReplay = CPAs.retrieveCPA(cpa2, ARGReplayCPA.class); checkNotNull(argReplay, "ARGReplay-CPA is needed for second analysis"); argReplay.setARGAndCPA(reached1, cpa1); } Algorithm algorithm2 = getAlgorithm(shutdownNotifier, singleConfig2, logger, cpa2); ReachedSet reached2 = createInitialReachedSetForRestart(cpa2, mainFunction, singleConfig2, logger); reached.setDelegate(reached2); stats.noOfAlgorithmsUsed++; stats.totalTime.start(); status = run0(reached2, algorithm2); stats.printIntermediateStatistics(System.out, Result.UNKNOWN, reached); stats.resetSubStatistics(); } catch (InvalidConfigurationException e) { logger.logUserException( Level.WARNING, e, "Exiting analysis because the configuration file is invalid"); } catch (IOException e) { logger.logUserException( Level.WARNING, e, "Exiting analysis because the configuration file could not be read"); } finally { // TODO close CPAs and algorithms } return status; }