All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.evosuite.symbolic.ConcolicExecution Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2010-2018 Gordon Fraser, Andrea Arcuri and EvoSuite
 * contributors
 *
 * This file is part of EvoSuite.
 *
 * EvoSuite is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3.0 of the License, or
 * (at your option) any later version.
 *
 * EvoSuite is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EvoSuite. If not, see .
 */
package org.evosuite.symbolic;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.evosuite.Properties;
import org.evosuite.ga.stoppingconditions.MaxStatementsStoppingCondition;
import org.evosuite.symbolic.expr.Constraint;
import org.evosuite.symbolic.expr.ExpressionExecutor;
import org.evosuite.symbolic.instrument.ConcolicInstrumentingClassLoader;
import org.evosuite.symbolic.vm.ArithmeticVM;
import org.evosuite.symbolic.vm.CallVM;
import org.evosuite.symbolic.vm.HeapVM;
import org.evosuite.symbolic.vm.JumpVM;
import org.evosuite.symbolic.vm.LocalsVM;
import org.evosuite.symbolic.vm.OtherVM;
import org.evosuite.symbolic.vm.PathConditionCollector;
import org.evosuite.symbolic.vm.SymbolicFunctionVM;
import org.evosuite.symbolic.vm.SymbolicEnvironment;
import org.evosuite.testcase.DefaultTestCase;
import org.evosuite.testcase.TestChromosome;
import org.evosuite.testcase.execution.ExecutionObserver;
import org.evosuite.testcase.execution.ExecutionResult;
import org.evosuite.testcase.execution.TestCaseExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.evosuite.dse.IVM;
import org.evosuite.dse.MainConfig;
import org.evosuite.dse.VM;

/**
 * 

* ConcolicExecution class. *

* * @author Gordon Fraser */ public abstract class ConcolicExecution { private static Logger logger = LoggerFactory .getLogger(ConcolicExecution.class); /** Instrumenting class loader */ private static final ConcolicInstrumentingClassLoader classLoader = new ConcolicInstrumentingClassLoader(); /** * Retrieve the path condition for a given test case * * @param test * a {@link org.evosuite.testcase.TestChromosome} object. * @return a {@link java.util.List} object. */ public static List getSymbolicPath(TestChromosome test) { TestChromosome dscCopy = (TestChromosome) test.clone(); DefaultTestCase defaultTestCase = (DefaultTestCase) dscCopy .getTestCase(); return executeConcolic(defaultTestCase); } public static List executeConcolic( DefaultTestCase defaultTestCase) { logger.debug("Preparing concolic execution"); /** * Prepare DSC configuration */ MainConfig.setInstance(); /** * Path constraint and symbolic environment */ SymbolicEnvironment env = new SymbolicEnvironment(classLoader); PathConditionCollector pc = new PathConditionCollector(); /** * VM listeners */ List listeners = new ArrayList(); listeners.add(new CallVM(env, classLoader)); listeners.add(new JumpVM(env, pc)); listeners.add(new HeapVM(env, pc, classLoader)); listeners.add(new LocalsVM(env)); listeners.add(new ArithmeticVM(env, pc)); listeners.add(new OtherVM(env)); listeners.add(new SymbolicFunctionVM(env, pc)); VM.getInstance().setListeners(listeners); VM.getInstance().prepareConcolicExecution(); defaultTestCase.changeClassLoader(classLoader); SymbolicObserver symbolicExecObserver = new SymbolicObserver(env); Set originalExecutionObservers = TestCaseExecutor.getInstance().getExecutionObservers(); TestCaseExecutor.getInstance().newObservers(); TestCaseExecutor.getInstance().addObserver(symbolicExecObserver); logger.info("Starting concolic execution"); ExecutionResult result = new ExecutionResult(defaultTestCase, null); try { logger.debug("Executing test"); long startConcolicExecutionTime = System.currentTimeMillis(); result = TestCaseExecutor.getInstance().execute(defaultTestCase, Properties.CONCOLIC_TIMEOUT); long estimatedConcolicExecutionTime = System.currentTimeMillis() - startConcolicExecutionTime; DSEStats.getInstance().reportNewConcolicExecutionTime(estimatedConcolicExecutionTime); MaxStatementsStoppingCondition.statementsExecuted(result .getExecutedStatements()); } catch (Exception e) { logger.error("Exception during concolic execution {}", e); return new ArrayList(); } finally { logger.debug("Cleaning concolic execution"); TestCaseExecutor.getInstance().setExecutionObservers(originalExecutionObservers); } VM.disableCallBacks(); // ignore all callbacks from now on List branches = pc.getPathCondition(); logger.info("Concolic execution ended with " + branches.size() + " branches collected"); if (!result.noThrownExceptions()) { int idx = result.getFirstPositionOfThrownException(); logger.info("Exception thrown: " + result.getExceptionThrownAtPosition(idx)); } logNrOfConstraints(branches); logger.debug("Cleaning concolic execution"); TestCaseExecutor.getInstance().setExecutionObservers(originalExecutionObservers); return branches; } private static void logNrOfConstraints(List branches) { int nrOfConstraints = 0; ExpressionExecutor exprExecutor = new ExpressionExecutor(); for (BranchCondition branchCondition : branches) { for (Constraint supporting_constraint : branchCondition .getSupportingConstraints()) { supporting_constraint.getLeftOperand().accept(exprExecutor,null); supporting_constraint.getRightOperand().accept(exprExecutor, null); nrOfConstraints++; } Constraint constraint = branchCondition.getConstraint(); constraint.getLeftOperand().accept(exprExecutor,null); constraint.getRightOperand().accept(exprExecutor,null); nrOfConstraints++; } logger.debug("nrOfConstraints=" + nrOfConstraints); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy