| /******************************************************************************* |
| * Copyright (c) 2016 CEA LIST. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Created on: 7 janv. 2014 |
| * |
| * Contributors: |
| * Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr |
| * - Initial API and implementation |
| ******************************************************************************/ |
| |
| #ifndef BASEHITPROCESSOR_H_ |
| #define BASEHITPROCESSOR_H_ |
| |
| #include <collection/BFContainer.h> |
| |
| #include <fml/executable/ExecutableForm.h> |
| |
| #include <fml/runtime/ExecutionContext.h> |
| |
| #include <fml/trace/TraceChecker.h> |
| |
| #include <fam/coverage/BaseCoverageFilter.h> |
| |
| #include <solver/api/SolverDef.h> |
| |
| |
| |
| namespace sep |
| { |
| |
| class BF; |
| |
| class AvmCode; |
| class AvmCoverageStatistics; |
| class AvmHitOrJumpProcessor; |
| |
| class EvaluationEnvironment; |
| class ExecutionContext; |
| class ExecutableSystem; |
| |
| class Operator; |
| |
| |
| class BaseHitProcessor |
| { |
| |
| |
| protected: |
| /** |
| * ATTRIBUTE |
| */ |
| AvmHitOrJumpProcessor & mHitOrJumpProcessor; |
| |
| AvmCoverageStatistics & mCoverageStatistics; |
| |
| EvaluationEnvironment & ENV; |
| |
| SolverDef::SOLVER_KIND mSolverKind; |
| |
| ExecutableForm mLocalExecutableForm; |
| |
| TraceChecker mTraceChecker; |
| |
| AvmCode mTraceObjective; |
| bool isPureStateTransitionNatureFlag; |
| |
| // Computing Local Variables |
| avm_size_t traceOffset; |
| |
| ListOfExecutionContext & mRelativeRootEC; |
| |
| ListOfExecutionContext::iterator ecIt; |
| ListOfExecutionContext::iterator ecItEnd; |
| |
| VectorOfExecutionContext & mRelativeLeafEC; |
| |
| ListOfExecutionContext & mAbsoluteLeafEC; |
| ListOfExecutionContext & mBlackHoleEC; |
| |
| ListOfExecutionContext & mBacktrackHitEC; |
| bool mBacktrackFlag; |
| |
| avm_size_t mJumpHeight; |
| |
| VectorOfExecutionContext mMaxHitEC; |
| avm_size_t hitOffset; |
| avm_size_t hitOffsetEnd; |
| |
| avm_size_t mHitCount; |
| |
| ExecutionContext::child_iterator ecChildIt; |
| ExecutionContext::child_iterator ecChildItEnd; |
| |
| |
| public: |
| /** |
| * CONSTRUCTOR |
| * Default |
| */ |
| BaseHitProcessor(AvmHitOrJumpProcessor & hojProcessor, |
| EvaluationEnvironment & anENV, Operator * op); |
| |
| /** |
| * DESTRUCTOR |
| */ |
| virtual ~BaseHitProcessor() |
| { |
| //!! NOTHING |
| } |
| |
| |
| virtual std::string strKind() = 0; |
| |
| /** |
| * GETTER |
| * mTraceObjective |
| */ |
| bool isPureStateTransitionObjective() const; |
| |
| |
| /** |
| * Coverage Test |
| */ |
| inline bool goalAchieved() |
| { |
| return( mCoverageStatistics.goalAchieved() ); |
| } |
| |
| inline bool hasUncovered() |
| { |
| return( mCoverageStatistics.hasUncovered() ); |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////////// |
| // CONFIGURE API |
| //////////////////////////////////////////////////////////////////////////// |
| |
| virtual bool configure(WObject * wfParameterObject); |
| |
| virtual bool resetConfig(); |
| |
| |
| //////////////////////////////////////////////////////////////////////////// |
| // HIT FILTERING API |
| //////////////////////////////////////////////////////////////////////////// |
| |
| virtual bool goalWillNeverAchieved(ExecutionContext * anEC) = 0; |
| |
| virtual bool hit(avm_size_t jumpHeight) = 0; |
| |
| virtual void hitSelect(avm_size_t jumpOffset) = 0; |
| |
| |
| inline bool hit(ExecutionContext * anEC, const BF & arg) |
| { |
| return( mTraceChecker.isSat((* anEC), arg) ); |
| } |
| |
| // FILTERING TOOLS |
| bool isAbsoluteLeaf(ExecutionContext * anEC); |
| |
| |
| //////////////////////////////////////////////////////////////////////////// |
| // WILL NEVER HIT FILTERING API |
| //////////////////////////////////////////////////////////////////////////// |
| |
| inline bool willNeverHit(ExecutionContext * anEC, const BF & arg) |
| { |
| ++mCoverageStatistics.mNumberOfBlackHoleTest; |
| |
| return( mTraceChecker.willNeverSat((* anEC), arg) ); |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////////// |
| // REPORT API |
| //////////////////////////////////////////////////////////////////////////// |
| |
| inline void reportMinimum(OutStream & os) const |
| { |
| if( mCoverageStatistics.hasUncovered() ) |
| { |
| toStreamUncovered(os); |
| } |
| toStreamCovered(os); |
| } |
| |
| |
| inline void reportDefault(OutStream & os) const |
| { |
| if( mCoverageStatistics.hasUncovered() ) |
| { |
| toStreamUncovered(os); |
| } |
| |
| if( mCoverageStatistics.hasCovered() ) |
| { |
| toStreamCovered(os); |
| } |
| } |
| |
| |
| |
| //////////////////////////////////////////////////////////////////////////// |
| // SERIALIZATION API |
| //////////////////////////////////////////////////////////////////////////// |
| |
| void toStreamCovered(OutStream & os) const; |
| |
| void toStreamUncovered(OutStream & os) const; |
| |
| inline virtual void toStream(OutStream & os) const |
| { |
| toStreamUncovered(os); |
| |
| toStreamCovered(os); |
| } |
| |
| }; |
| |
| |
| } /* namespace sep */ |
| |
| #endif /* BASEHITPROCESSOR_H_ */ |