@@ -421,7 +421,8 @@ void MockBuilder::buildAnnotationTaintOutput(llvm::Value *elem,
421421 taintOutputPtr->getTaintType ().c_str ());
422422 return ;
423423 }
424- buildCallKleeTaintFunction (" klee_add_taint" , elem, source->second , false );
424+ buildCallKleeTaintFunction (" klee_add_taint" , elem, source->second ,
425+ llvm::Type::getVoidTy (mockModule->getContext ()));
425426}
426427
427428void MockBuilder::buildAnnotationTaintPropagation (
@@ -460,11 +461,13 @@ void MockBuilder::buildAnnotationTaintPropagation(
460461 llvm::Value *propagationValue =
461462 func->getArg (taintPropagationPtr->propagationParameterIndex );
462463 auto brValuePropagate = buildCallKleeTaintFunction (
463- " klee_check_taint_source" , propagationValue, source->second , true );
464+ " klee_check_taint_source" , propagationValue, source->second ,
465+ llvm::Type::getInt1Ty (mockModule->getContext ()));
464466 builder->CreateCondBr (brValuePropagate, propagateBB, contBB);
465467
466468 builder->SetInsertPoint (propagateBB);
467- buildCallKleeTaintFunction (" klee_add_taint" , elem, source->second , false );
469+ buildCallKleeTaintFunction (" klee_add_taint" , elem, source->second ,
470+ llvm::Type::getVoidTy (mockModule->getContext ()));
468471 builder->CreateBr (contBB);
469472
470473 curFunc->getBasicBlockList ().push_back (contBB);
@@ -495,8 +498,13 @@ void MockBuilder::buildAnnotationTaintSink(llvm::Value *elem,
495498 llvm::BasicBlock::Create (mockModule->getContext (), sinkCondName, curFunc);
496499 llvm::BasicBlock *contBB = llvm::BasicBlock::Create (
497500 mockModule->getContext (), " continue_" + sinkCondName);
498- auto brValueSink = buildCallKleeTaintFunction (" klee_check_taint_sink" , elem,
499- sink->second , true );
501+ auto taintRule = buildCallKleeTaintFunction (
502+ " klee_get_taint_rule" , elem, sink->second ,
503+ llvm::Type::getInt64Ty (mockModule->getContext ()));
504+ const auto brValueSink =
505+ builder->CreateCmp (llvm::CmpInst::Predicate::ICMP_NE, taintRule,
506+ llvm::ConstantInt::get (mockModule->getContext (),
507+ llvm::APInt (64 , 0 , false )));
500508 builder->CreateCondBr (brValueSink, sinkBB, contBB);
501509
502510 builder->SetInsertPoint (sinkBB);
@@ -509,13 +517,16 @@ void MockBuilder::buildAnnotationTaintSink(llvm::Value *elem,
509517 sinkHitCondName);
510518 fromIf = builder->GetInsertBlock ();
511519 curFunc = fromIf->getParent ();
512- llvm::BasicBlock *sinkHitBB = llvm::BasicBlock::Create (
520+ llvm::BasicBlock *taintHitBB = llvm::BasicBlock::Create (
513521 mockModule->getContext (), sinkHitCondName, curFunc);
514- auto brValueSinkHit = builder->CreateLoad (intType, sinkHitCond);
515- builder->CreateCondBr (brValueSinkHit, sinkHitBB, contBB);
516-
517- builder->SetInsertPoint (sinkHitBB);
518- buildCallKleeTaintSinkHit (sink->second );
522+ auto brValueTaintHit = builder->CreateLoad (intType, sinkHitCond);
523+ builder->CreateCondBr (brValueTaintHit, taintHitBB, contBB);
524+
525+ builder->SetInsertPoint (taintHitBB);
526+ const auto taintRuleId = builder->CreateSub (
527+ taintRule, llvm::ConstantInt::get (mockModule->getContext (),
528+ llvm::APInt (64 , 1 , false )));
529+ buildCallKleeTaintHit (taintRuleId);
519530 builder->CreateBr (contBB);
520531
521532 curFunc->getBasicBlockList ().push_back (contBB);
@@ -525,11 +536,7 @@ void MockBuilder::buildAnnotationTaintSink(llvm::Value *elem,
525536llvm::CallInst *
526537MockBuilder::buildCallKleeTaintFunction (const std::string &functionName,
527538 llvm::Value *source, size_t taint,
528- bool returnBool) {
529- const auto returnType = returnBool
530- ? llvm::Type::getInt1Ty (mockModule->getContext ())
531- : llvm::Type::getVoidTy (mockModule->getContext ());
532-
539+ llvm::Type *returnType) {
533540 auto *kleeTaintFunctionType = llvm::FunctionType::get (
534541 returnType,
535542 {llvm::Type::getInt8PtrTy (mockModule->getContext ()),
@@ -592,17 +599,13 @@ MockBuilder::buildCallKleeTaintFunction(const std::string &functionName,
592599 llvm::APInt (64 , taint, false ))});
593600}
594601
595- void MockBuilder::buildCallKleeTaintSinkHit ( size_t taintSink ) {
596- auto *kleeTaintSinkHitType = llvm::FunctionType::get (
602+ void MockBuilder::buildCallKleeTaintHit (llvm::Value *taintRule ) {
603+ auto *kleeTaintHitType = llvm::FunctionType::get (
597604 llvm::Type::getVoidTy (mockModule->getContext ()),
598605 {llvm::Type::getInt64Ty (mockModule->getContext ())}, false );
599- auto kleeTaintSinkHitCallee = mockModule->getOrInsertFunction (
600- " klee_taint_sink_hit" , kleeTaintSinkHitType);
601-
602- builder->CreateCall (
603- kleeTaintSinkHitCallee,
604- {llvm::ConstantInt::get (mockModule->getContext (),
605- llvm::APInt (64 , taintSink, false ))});
606+ auto kleeTaintSinkHitCallee =
607+ mockModule->getOrInsertFunction (" klee_taint_hit" , kleeTaintHitType);
608+ builder->CreateCall (kleeTaintSinkHitCallee, {taintRule});
606609}
607610
608611void MockBuilder::buildAnnotationForExternalFunctionArgs (
0 commit comments