Static Value-Flow Analysis
Classes | Public Types | Public Member Functions | Protected Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | List of all members
SVF::RaceResultValidator Class Reference

Validate the result of concurrent analysis. More...

#include <MTAResultValidator.h>

Inheritance diagram for SVF::RaceResultValidator:
SVF::MHPValidator SVF::RaceValidator

Classes

class  AccessPair
 

Public Types

typedef int RC_FLAG
 
typedef int RC_FLAG
 

Public Member Functions

virtual ~RaceResultValidator ()
 Destructor. More...
 
void init (SVFModule *M)
 Initialization. More...
 
void analyze ()
 Analysis. More...
 
void release ()
 Release resource. More...
 
bool hasValidationTarget () const
 Check if the input program has validation target. More...
 
virtual ~RaceResultValidator ()
 Destructor. More...
 
void init (SVFModule *M)
 Initialization. More...
 
void analyze ()
 Analysis. More...
 
void release ()
 Release resource. More...
 
bool hasValidationTarget () const
 Check if the input program has validation target. More...
 

Protected Member Functions

virtual bool mayAccessAliases (const Instruction *I1, const Instruction *I2)
 
virtual bool mayHappenInParallel (const Instruction *I1, const Instruction *I2)
 
virtual bool protectedByCommonLocks (const Instruction *I1, const Instruction *I2)
 
virtual bool mayHaveDataRace (const Instruction *I1, const Instruction *I2)
 
void collectValidationTargets ()
 
void validateAll ()
 Perform validation for all targets. More...
 
std::string getOutput (const char *scenario, bool analysisRes, bool expectedRes)
 Get the validation result string of a single validation scenario. More...
 
virtual bool mayAccessAliases (const Instruction *I1, const Instruction *I2)
 
virtual bool mayHappenInParallel (const Instruction *I1, const Instruction *I2)
 
virtual bool protectedByCommonLocks (const Instruction *I1, const Instruction *I2)
 
virtual bool mayHaveDataRace (const Instruction *I1, const Instruction *I2)
 
void collectValidationTargets ()
 
void validateAll ()
 Perform validation for all targets. More...
 
std::string getOutput (const char *scenario, bool analysisRes, bool expectedRes)
 Get the validation result string of a single validation scenario. More...
 

Private Member Functions

const InstructiongetPreviousMemoryAccessInst (const Instruction *I)
 
const InstructiongetPreviousMemoryAccessInst (const Instruction *I)
 

Static Private Member Functions

static bool compare (const CallBase *CI1, const CallBase *CI2)
 
static bool compare (const CallBase *CI1, const CallBase *CI2)
 

Private Attributes

SVFModuleM
 
std::vector< AccessPairaccessPairs
 
RC_FLAG selectedValidationScenarios
 

Static Private Attributes

static const RC_FLAG RC_MHP = 0x01
 Constant RC_FLAG values. More...
 
static const RC_FLAG RC_ALIASES = 0x02
 
static const RC_FLAG RC_PROTECTED = 0x04
 
static const RC_FLAG RC_RACE = 0x10
 
static constexpr char const * RC_ACCESS = "RC_ACCESS"
 

Detailed Description

Validate the result of concurrent analysis.

The properties to validate of two memory accesses include one or more of the following four: (1) they may accesses aliases; (2) they may happen in parallel; (3) they are protected by common lock(s); (4) they may cause a data race error. The ground truth are specified by the "RC_ACCESS" function in the target program.

Users may utilize this result validator to validate their analysis with one or more of the four properties, by inheriting the RCResultValidator class. The corresponding virtual function of the desired property should be overridden.

Definition at line 169 of file MTAResultValidator.h.

Member Typedef Documentation

◆ RC_FLAG [1/2]

Definition at line 172 of file MTAResultValidator.h.

◆ RC_FLAG [2/2]

Definition at line 171 of file MTAResultValidator.h.

Constructor & Destructor Documentation

◆ ~RaceResultValidator() [1/2]

virtual SVF::RaceResultValidator::~RaceResultValidator ( )
inlinevirtual

Destructor.

Definition at line 210 of file MTAResultValidator.h.

211  {
212  release();
213  }
void release()
Release resource.

◆ ~RaceResultValidator() [2/2]

virtual SVF::RaceResultValidator::~RaceResultValidator ( )
inlinevirtual

Destructor.

Definition at line 209 of file MTAResultValidator.h.

210  {
211  release();
212  }

Member Function Documentation

◆ analyze() [1/2]

void SVF::RaceResultValidator::analyze ( )
inline

Analysis.

Definition at line 224 of file MTAResultValidator.h.

225  {
226  validateAll();
227  }
void validateAll()
Perform validation for all targets.

◆ analyze() [2/2]

void SVF::RaceResultValidator::analyze ( )
inline

Analysis.

Definition at line 223 of file MTAResultValidator.h.

224  {
225  validateAll();
226  }

◆ collectValidationTargets() [1/2]

void RaceResultValidator::collectValidationTargets ( )
protected

Collect the targets for validations. The targets should be memory access Instructions in pairs. The collected targets are stored in the member variable "accessPairs".

Definition at line 600 of file MTAResultValidator.cpp.

601 {
602  // Collect call sites of all RC_ACCESS function calls.
603  std::vector<const CallBase*> csInsts;
604  const Function* F = nullptr;
605  for (Module &M : LLVMModuleSet::getLLVMModuleSet()->getLLVMModules())
606  {
607  for(auto it = M.begin(); it != M.end(); it++)
608  {
609  const std::string fName = (*it).getName().str();
610  if(fName.find(RC_ACCESS) != std::string::npos)
611  {
612  F = &(*it);
613  break;
614  }
615  }
616  }
617  if (!F) return;
618 
619  for (Value::const_use_iterator it = F->use_begin(), ie =
620  F->use_end(); it != ie; ++it)
621  {
622  const Use *u = &*it;
623  const Value *user = u->getUser();
624  if(LLVMUtil::isCallSite(user))
625  {
626  const CallBase* csInst = LLVMUtil::getLLVMCallSite(user);
627  csInsts.push_back(csInst);
628  }
629  }
630  assert(csInsts.size() % 2 == 0 && "We should have RC_ACCESS called in pairs.");
631 
632  // Sort the validation sites according to their ids.
633  std::sort(csInsts.begin(), csInsts.end(), compare);
634 
635  // Generate access pairs.
636  for (int i = 0, e = csInsts.size(); i != e;)
637  {
638  const CallBase* CI1 = csInsts[i++];
639  const CallBase* CI2 = csInsts[i++];
640  const ConstantInt* C = SVFUtil::dyn_cast<ConstantInt>(CI1->getArgOperand(1));
641  assert(C);
642  const Instruction* I1 = getPreviousMemoryAccessInst(CI1);
643  const Instruction* I2 = getPreviousMemoryAccessInst(CI2);
644  assert(I1 && I2 && "RC_ACCESS should be placed immediately after the target memory access.");
645  RC_FLAG flags = C->getZExtValue();
646  accessPairs.push_back(AccessPair(I1, I2, flags));
647  }
648 }
#define F(f)
const char *const string
Definition: cJSON.h:172
static LLVMModuleSet * getLLVMModuleSet()
Definition: LLVMModule.h:105
static bool compare(const CallBase *CI1, const CallBase *CI2)
const Instruction * getPreviousMemoryAccessInst(const Instruction *I)
std::vector< AccessPair > accessPairs
static constexpr char const * RC_ACCESS
iterator begin()
Definition: SVFModule.h:133
iterator end()
Definition: SVFModule.h:141
const CallBase * getLLVMCallSite(const Value *value)
Return LLVM callsite given a value.
Definition: LLVMUtil.h:59
bool isCallSite(const Instruction *inst)
Whether an instruction is a call or invoke instruction.
Definition: LLVMUtil.h:45
llvm::CallBase CallBase
Definition: BasicTypes.h:146
llvm::Use Use
Definition: BasicTypes.h:72
llvm::Function Function
Definition: BasicTypes.h:85
llvm::Instruction Instruction
Definition: BasicTypes.h:87
llvm::Value Value
LLVM Basic classes.
Definition: BasicTypes.h:82
llvm::Module Module
Definition: BasicTypes.h:84
llvm::ConstantInt ConstantInt
Definition: BasicTypes.h:125

◆ collectValidationTargets() [2/2]

void SVF::RaceResultValidator::collectValidationTargets ( )
inlineprotected

Collect the targets for validations. The targets should be memory access Instructions in pairs. The collected targets are stored in the member variable "accessPairs".

Definition at line 274 of file MTAResultValidator.h.

275  {
276  // Collect call sites of all RC_ACCESS function calls.
277  std::vector<const CallBase*> csInsts;
278  const Function* F = nullptr;
279  for (Module &M : LLVMModuleSet::getLLVMModuleSet()->getLLVMModules())
280  {
281  for(auto it = M.begin(); it != M.end(); it++)
282  {
283  const std::string fName = (*it).getName().str();
284  if(fName.find(RC_ACCESS) != std::string::npos)
285  {
286  F = &(*it);
287  break;
288  }
289  }
290  }
291  if (!F) return;
292 
293  for (Value::const_use_iterator it = F->use_begin(), ie =
294  F->use_end(); it != ie; ++it)
295  {
296  const Use *u = &*it;
297  const Value *user = u->getUser();
298  if(LLVMUtil::isCallSite(user))
299  {
300  const CallBase* csInst = LLVMUtil::getLLVMCallSite(user);
301  csInsts.push_back(csInst);
302  }
303  }
304  assert(csInsts.size() % 2 == 0 && "We should have RC_ACCESS called in pairs.");
305 
306  // Sort the validation sites according to their ids.
307  std::sort(csInsts.begin(), csInsts.end(), compare);
308 
309  // Generate access pairs.
310  for (int i = 0, e = csInsts.size(); i != e;)
311  {
312  const CallBase* CI1 = csInsts[i++];
313  const CallBase* CI2 = csInsts[i++];
314  const ConstantInt* C = SVFUtil::dyn_cast<ConstantInt>(CI1->getArgOperand(1));
315  assert(C);
316  const Instruction* I1 = getPreviousMemoryAccessInst(CI1);
317  const Instruction* I2 = getPreviousMemoryAccessInst(CI2);
318  assert(I1 && I2 && "RC_ACCESS should be placed immediately after the target memory access.");
319  RC_FLAG flags = C->getZExtValue();
320  accessPairs.push_back(AccessPair(I1, I2, flags));
321  }
322  }

◆ compare() [1/2]

static bool SVF::RaceResultValidator::compare ( const CallBase CI1,
const CallBase CI2 
)
inlinestaticprivate

Comparison function to sort the validation targets in ascending order of the validation id (i.e., the 1st argument of RC_ACCESS function call).

Definition at line 306 of file MTAResultValidator.h.

307  {
308  const Value *V1 = CI1->getArgOperand(0);
309  const Value *V2 = CI2->getArgOperand(0);
310  const ConstantInt* C1 = SVFUtil::dyn_cast<ConstantInt>(V1);
311  const ConstantInt* C2 = SVFUtil::dyn_cast<ConstantInt>(V2);
312  assert(0 != C1 && 0 != C2);
313  return C1->getZExtValue() < C2->getZExtValue();
314  }

◆ compare() [2/2]

static bool SVF::RaceResultValidator::compare ( const CallBase CI1,
const CallBase CI2 
)
inlinestaticprivate

Comparison function to sort the validation targets in ascending order of the validation id (i.e., the 1st argument of RC_ACCESS function call).

Definition at line 398 of file MTAResultValidator.h.

399  {
400  const Value *V1 = CI1->getArgOperand(0);
401  const Value *V2 = CI2->getArgOperand(0);
402  const ConstantInt* C1 = SVFUtil::dyn_cast<ConstantInt>(V1);
403  const ConstantInt* C2 = SVFUtil::dyn_cast<ConstantInt>(V2);
404  assert(0 != C1 && 0 != C2);
405  return C1->getZExtValue() < C2->getZExtValue();
406  }

◆ getOutput() [1/2]

std::string SVF::RaceResultValidator::getOutput ( const char *  scenario,
bool  analysisRes,
bool  expectedRes 
)
inlineprotected

Get the validation result string of a single validation scenario.

Definition at line 281 of file MTAResultValidator.h.

283  {
284  std::string ret(scenario);
285  ret += "\t";
286  if (expectedRes)
287  ret += " T: ";
288  else
289  ret += " F: ";
290  if (analysisRes == expectedRes)
291  ret += SVFUtil::sucMsg("SUCCESS");
292  else
293  ret += SVFUtil::errMsg("FAILURE");
294  return ret;
295  }
std::string sucMsg(const std::string &msg)
Returns successful message by converting a string into green string output.
Definition: SVFUtil.cpp:53
std::string errMsg(const std::string &msg)
Print error message by converting a string into red string output.
Definition: SVFUtil.cpp:76

◆ getOutput() [2/2]

std::string SVF::RaceResultValidator::getOutput ( const char *  scenario,
bool  analysisRes,
bool  expectedRes 
)
inlineprotected

Get the validation result string of a single validation scenario.

Definition at line 373 of file MTAResultValidator.h.

375  {
376  std::string ret(scenario);
377  ret += "\t";
378  if (expectedRes)
379  ret += " T: ";
380  else
381  ret += " F: ";
382  if (analysisRes == expectedRes)
383  ret += SVFUtil::sucMsg("SUCCESS");
384  else
385  ret += SVFUtil::errMsg("FAILURE");
386  return ret;
387  }

◆ getPreviousMemoryAccessInst() [1/2]

const Instruction * RaceResultValidator::getPreviousMemoryAccessInst ( const Instruction I)
private

Get the previous LoadInst or StoreInst from Instruction "I" in the same BasicBlock. Return nullptr if none exists.

Definition at line 697 of file MTAResultValidator.cpp.

698 {
699  I = I->getPrevNode();
700  while (I)
701  {
702  if (SVFUtil::isa<LoadInst>(I) || SVFUtil::isa<StoreInst>(I))
703  return I;
704 
706 
707  if (const SVFFunction *callee = SVFUtil::getCallee(inst))
708  {
709  if (callee->getName().find("llvm.memset") != std::string::npos)
710  return I;
711 
712  }
713  I = I->getPrevNode();
714  }
715  return nullptr;
716 }
SVFInstruction * getSVFInstruction(const Instruction *inst) const
Definition: LLVMModule.h:224
const SVFFunction * getCallee(const CallSite cs)
Return callee of a callsite. Return null if this is an indirect call.
Definition: SVFUtil.h:241

◆ getPreviousMemoryAccessInst() [2/2]

const Instruction* SVF::RaceResultValidator::getPreviousMemoryAccessInst ( const Instruction I)
inlineprivate

Get the previous LoadInst or StoreInst from Instruction "I" in the same BasicBlock. Return nullptr if none exists.

Definition at line 413 of file MTAResultValidator.h.

415  {
416  I = I->getPrevNode();
417  while (I)
418  {
419  if (SVFUtil::isa<LoadInst, StoreInst>(I))
420  return I;
421 
422  const SVFInstruction* inst = LLVMModuleSet::getLLVMModuleSet()->getSVFInstruction(I);
423 
424  if (const SVFFunction *callee = SVFUtil::getCallee(inst))
425  {
426  if (callee->getName().find("llvm.memset") != std::string::npos)
427  return I;
428 
429  }
430  I = I->getPrevNode();
431  }
432  return nullptr;
433  }

◆ hasValidationTarget() [1/2]

bool SVF::RaceResultValidator::hasValidationTarget ( ) const
inline

Check if the input program has validation target.

Definition at line 235 of file MTAResultValidator.h.

236  {
237  return !accessPairs.empty();
238  }

◆ hasValidationTarget() [2/2]

bool SVF::RaceResultValidator::hasValidationTarget ( ) const
inline

Check if the input program has validation target.

Definition at line 234 of file MTAResultValidator.h.

235  {
236  return !accessPairs.empty();
237  }

◆ init() [1/2]

void SVF::RaceResultValidator::init ( SVFModule M)
inline

Initialization.

Definition at line 216 of file MTAResultValidator.h.

217  {
218  this->M = M;
221  }
static const RC_FLAG RC_ALIASES
static const RC_FLAG RC_MHP
Constant RC_FLAG values.
static const RC_FLAG RC_RACE
static const RC_FLAG RC_PROTECTED

◆ init() [2/2]

void SVF::RaceResultValidator::init ( SVFModule M)
inline

Initialization.

Definition at line 215 of file MTAResultValidator.h.

216  {
217  this->M = M;
220  }

◆ mayAccessAliases() [1/2]

virtual bool SVF::RaceResultValidator::mayAccessAliases ( const Instruction I1,
const Instruction I2 
)
inlineprotectedvirtual

Interface to the specific validation properties. Override one or more to implement your own analysis.

Definition at line 244 of file MTAResultValidator.h.

246  {
248  return true;
249  }

◆ mayAccessAliases() [2/2]

virtual bool SVF::RaceResultValidator::mayAccessAliases ( const Instruction I1,
const Instruction I2 
)
inlineprotectedvirtual

Interface to the specific validation properties. Override one or more to implement your own analysis.

Definition at line 243 of file MTAResultValidator.h.

245  {
247  return true;
248  }

◆ mayHappenInParallel() [1/2]

virtual bool SVF::RaceResultValidator::mayHappenInParallel ( const Instruction I1,
const Instruction I2 
)
inlineprotectedvirtual

Reimplemented in SVF::MHPValidator.

Definition at line 250 of file MTAResultValidator.h.

252  {
254  return true;
255  }

◆ mayHappenInParallel() [2/2]

virtual bool SVF::RaceResultValidator::mayHappenInParallel ( const Instruction I1,
const Instruction I2 
)
inlineprotectedvirtual

Reimplemented in SVF::MHPValidator.

Definition at line 249 of file MTAResultValidator.h.

251  {
253  return true;
254  }

◆ mayHaveDataRace() [1/2]

virtual bool SVF::RaceResultValidator::mayHaveDataRace ( const Instruction I1,
const Instruction I2 
)
inlineprotectedvirtual

Definition at line 262 of file MTAResultValidator.h.

264  {
266  return true;
267  }

◆ mayHaveDataRace() [2/2]

virtual bool SVF::RaceResultValidator::mayHaveDataRace ( const Instruction I1,
const Instruction I2 
)
inlineprotectedvirtual

Definition at line 261 of file MTAResultValidator.h.

263  {
265  return true;
266  }

◆ protectedByCommonLocks() [1/2]

virtual bool SVF::RaceResultValidator::protectedByCommonLocks ( const Instruction I1,
const Instruction I2 
)
inlineprotectedvirtual

Reimplemented in SVF::RaceValidator.

Definition at line 256 of file MTAResultValidator.h.

258  {
260  return true;
261  }

◆ protectedByCommonLocks() [2/2]

virtual bool SVF::RaceResultValidator::protectedByCommonLocks ( const Instruction I1,
const Instruction I2 
)
inlineprotectedvirtual

Reimplemented in SVF::RaceValidator.

Definition at line 255 of file MTAResultValidator.h.

257  {
259  return true;
260  }

◆ release() [1/2]

void SVF::RaceResultValidator::release ( )
inline

Release resource.

Definition at line 230 of file MTAResultValidator.h.

231  {
232  }

◆ release() [2/2]

void SVF::RaceResultValidator::release ( )
inline

Release resource.

Definition at line 229 of file MTAResultValidator.h.

230  {
231  }

◆ validateAll() [1/2]

void RaceResultValidator::validateAll ( )
protected

Perform validation for all targets.

Definition at line 650 of file MTAResultValidator.cpp.

651 {
652  SVFUtil::outs() << SVFUtil::pasMsg(" --- Analysis Result Validation ---\n");
653 
654  // Iterate every memory access pair to perform the validation.
655  for (int i = 0, e = accessPairs.size(); i != e; ++i)
656  {
657  const AccessPair &ap = accessPairs[i];
658  const Instruction* I1 = ap.getInstruction1();
659  const Instruction* I2 = ap.getInstruction2();
660 
661  bool mhp = mayHappenInParallel(I1, I2);
662  bool alias = mayAccessAliases(I1, I2);
663  bool protect = protectedByCommonLocks(I1, I2);
664  bool racy = mayHaveDataRace(I1, I2);
665 
666  SVFUtil::outs() << "For the memory access pair at ("
670  {
671  SVFUtil::outs() << "\t"
672  << getOutput("ALIASES", alias, ap.isFlaged(RC_ALIASES))
673  << "\n";
674  }
676  {
677  SVFUtil::outs() << "\t"
678  << getOutput("MHP", mhp, ap.isFlaged(RC_MHP)) << "\n";
679  }
681  {
682  SVFUtil::outs() << "\t"
683  << getOutput("PROTECT", protect,
684  ap.isFlaged(RC_PROTECTED)) << "\n";
685  }
687  {
688  SVFUtil::outs() << "\t"
689  << getOutput("RACE", racy, ap.isFlaged(RC_RACE))
690  << "\n";
691  }
692  }
693 
694  SVFUtil::outs() << "\n";
695 }
SVFValue * getSVFValue(const Value *value)
virtual bool mayHaveDataRace(const Instruction *I1, const Instruction *I2)
virtual bool mayAccessAliases(const Instruction *I1, const Instruction *I2)
virtual bool protectedByCommonLocks(const Instruction *I1, const Instruction *I2)
std::string getOutput(const char *scenario, bool analysisRes, bool expectedRes)
Get the validation result string of a single validation scenario.
virtual bool mayHappenInParallel(const Instruction *I1, const Instruction *I2)
virtual const std::string getSourceLoc() const
Definition: SVFValue.h:280
std::string pasMsg(const std::string &msg)
Print each pass/phase message by converting a string into blue string output.
Definition: SVFUtil.cpp:99
std::ostream & outs()
Overwrite llvm::outs()
Definition: SVFUtil.h:50

◆ validateAll() [2/2]

void SVF::RaceResultValidator::validateAll ( )
inlineprotected

Perform validation for all targets.

Definition at line 325 of file MTAResultValidator.h.

326  {
327  SVFUtil::outs() << SVFUtil::pasMsg(" --- Analysis Result Validation ---\n");
328 
329  // Iterate every memory access pair to perform the validation.
330  for (int i = 0, e = accessPairs.size(); i != e; ++i)
331  {
332  const AccessPair &ap = accessPairs[i];
333  const Instruction* I1 = ap.getInstruction1();
334  const Instruction* I2 = ap.getInstruction2();
335 
336  bool mhp = mayHappenInParallel(I1, I2);
337  bool alias = mayAccessAliases(I1, I2);
338  bool protect = protectedByCommonLocks(I1, I2);
339  bool racy = mayHaveDataRace(I1, I2);
340 
341  SVFUtil::outs() << "For the memory access pair at ("
345  {
346  SVFUtil::outs() << "\t"
347  << getOutput("ALIASES", alias, ap.isFlaged(RC_ALIASES))
348  << "\n";
349  }
351  {
352  SVFUtil::outs() << "\t"
353  << getOutput("MHP", mhp, ap.isFlaged(RC_MHP)) << "\n";
354  }
356  {
357  SVFUtil::outs() << "\t"
358  << getOutput("PROTECT", protect,
359  ap.isFlaged(RC_PROTECTED)) << "\n";
360  }
362  {
363  SVFUtil::outs() << "\t"
364  << getOutput("RACE", racy, ap.isFlaged(RC_RACE))
365  << "\n";
366  }
367  }
368 
369  SVFUtil::outs() << "\n";
370  }

Member Data Documentation

◆ accessPairs

std::vector< AccessPair > SVF::RaceResultValidator::accessPairs
private

Definition at line 299 of file MTAResultValidator.h.

◆ M

SVFModule * SVF::RaceResultValidator::M
private

Definition at line 298 of file MTAResultValidator.h.

◆ RC_ACCESS

static constexpr char const * SVF::RaceResultValidator::RC_ACCESS = "RC_ACCESS"
staticconstexprprivate

The name of the function which is used to specify the ground truth of the validation properties in the target program.

Definition at line 334 of file MTAResultValidator.h.

◆ RC_ALIASES

static const RC_FLAG SVF::RaceResultValidator::RC_ALIASES = 0x02
staticprivate

Definition at line 327 of file MTAResultValidator.h.

◆ RC_MHP

static const RC_FLAG SVF::RaceResultValidator::RC_MHP = 0x01
staticprivate

Constant RC_FLAG values.

Definition at line 326 of file MTAResultValidator.h.

◆ RC_PROTECTED

static const RC_FLAG SVF::RaceResultValidator::RC_PROTECTED = 0x04
staticprivate

Definition at line 328 of file MTAResultValidator.h.

◆ RC_RACE

static const RC_FLAG SVF::RaceResultValidator::RC_RACE = 0x10
staticprivate

Definition at line 329 of file MTAResultValidator.h.

◆ selectedValidationScenarios

RC_FLAG SVF::RaceResultValidator::selectedValidationScenarios
private

Definition at line 300 of file MTAResultValidator.h.


The documentation for this class was generated from the following files: