diff options
-rw-r--r-- | README.md | 17 | ||||
-rw-r--r-- | bruiser/bruiser.cpp | 156 | ||||
-rw-r--r-- | bruiser/bruiser.h | 50 | ||||
-rw-r--r-- | mutator-lvl0.cpp | 10 | ||||
-rw-r--r-- | mutator_aux.cpp | 14 | ||||
-rw-r--r-- | mutator_aux.h | 4 | ||||
-rw-r--r-- | mutator_report.cpp | 5 | ||||
-rw-r--r-- | mutator_report.h | 1 |
8 files changed, 236 insertions, 21 deletions
@@ -56,6 +56,23 @@ Mutation levels have nothing to do with the order of mutants.<br/> **bruiser** tries to break your code.<br/> <br/> +## How To get project mutator + +Assuming you already have the LLVM/Clang libraries, just run : + +```bash + +git clone https://github.com/bloodstalker/mutator +make +make install + +``` + +If you don't have them, you can build them or get them from a repo.<br/> +To build LLVM/Clang from source take a look at [here](https://clang.llvm.org/get_started.html) and [here](http://llvm.org/docs/GettingStarted.html).<br/> +To build `safercpp-arr` you to need to build Clang with RTTI enabled.<br/> +On Fedora you can just get the Requirements by dnf. For Ubuntu and Debian either look at mutator's `.travis.yaml` or check out the [nightly builds for Debian/Ubuntu](apt.llvm.org).<br/> + ### Dev Status All the as-of-yet implemented features of the project are very much buildable and usable at all times, even during the dev phase on the master branch. If something's not working properly let me know.<br/> diff --git a/bruiser/bruiser.cpp b/bruiser/bruiser.cpp index a7df7ca..4371e25 100644 --- a/bruiser/bruiser.cpp +++ b/bruiser/bruiser.cpp @@ -26,7 +26,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* /*standard headers*/ #include <string> #include <iostream> -#include <cassert> /*LLVM headers*/ #include "clang/AST/AST.h" #include "clang/AST/ASTConsumer.h" @@ -49,32 +48,170 @@ using namespace clang::driver; using namespace clang::tooling; /**********************************************************************************************************************/ /*global vars*/ - static llvm::cl::OptionCategory BruiserCategory("Empty"); /**********************************************************************************************************************/ +/*the implementation of the bruiser logger.*/ +bruiser::BruiserReport::BruiserReport () +{ + BruiserLog.open("bruiser.log"); +} + +bruiser::BruiserReport::~BruiserReport() +{ + BruiserLog.close(); +} + +bool bruiser::BruiserReport::PrintToLog(std::string __in_arg) +{ + BruiserLog << __in_arg << "\n"; + return !BruiserLog.bad(); +} +/**********************************************************************************************************************/ +bruiser::TypeInfo::TypeInfo(const clang::ast_type_traits::DynTypedNode* __dtn) : DTN(__dtn) {}; + +bruiser::TypeInfo::~TypeInfo() {}; + +const clang::Type* bruiser::TypeInfo::getTypeInfo(clang::ASTContext* __astc) +{ + const clang::Expr* EXP = DTN->get<clang::Expr>(); + + const clang::Type* TP = EXP->getType().getTypePtr(); + + return __astc->getCanonicalType(TP); +} +/**********************************************************************************************************************/ +class AbstractMatcherHandler : public virtual MatchFinder::MatchCallback +{ + public: + AbstractMatcherHandler (Rewriter &Rewrite) : R(Rewrite) {} + + public: + virtual void run(const MatchFinder::MatchResult &MR) + { + + } + + private: + Rewriter &R; +}; +/**********************************************************************************************************************/ +class MatcherHandlerLVL0 : public AbstractMatcherHandler +{ + public: + MatcherHandlerLVL0 (Rewriter &Rewrite) : AbstractMatcherHandler(Rewrite) {} + + virtual void run(const MatchFinder::MatchResult &MR) override + { + + } + + private: +}; +/**********************************************************************************************************************/ +class NameFinder +{ + public: + NameFinder (Rewriter &Rewrite) : Rewrite(Rewrite) {} + + virtual void runDeclRefExprMatcher(const llvm::StringRef __sr) + { + //Matcher.addMatcher(); + } + + virtual void runDeclMatcher(const llvm::StringRef __sr) + { + + } + + private: + Rewriter &Rewrite; + MatchFinder Matcher; +}; +/**********************************************************************************************************************/ +/**********************************************************************************************************************/ +/**********************************************************************************************************************/ +class IfBreaker : public MatchFinder::MatchCallback +{ + public: + IfBreaker (Rewriter &Rewrite) : Rewrite(Rewrite) {} + + virtual void run(const MatchFinder::MatchResult &MR) + { + if (MR.Nodes.getNodeAs<clang::UnaryOperator>("uno") != nullptr) + { + const clang::UnaryOperator* UO = MR.Nodes.getNodeAs<clang::UnaryOperator>("uno"); + + SourceLocation SL = UO->getLocStart(); + CheckSLValidity(SL); + SL = Devi::SourceLocationHasMacro(SL, Rewrite); + + const Expr* EXP = UO->getSubExpr(); + const ast_type_traits::DynTypedNode DynNode = ast_type_traits::DynTypedNode::create<clang::Expr>(*EXP); + bruiser::TypeInfo TIProto(&DynNode); + + const clang::Type* CTP = TIProto.getTypeInfo(MR.Context); + + //Matcher.addMatcher(); + } + + if (MR.Nodes.getNodeAs<clang::BinaryOperator>("dous") != nullptr) + { + const clang::BinaryOperator* BO = MR.Nodes.getNodeAs<clang::BinaryOperator>("dous"); + + SourceLocation SL = BO->getLocStart(); + CheckSLValidity(SL); + SL = Devi::SourceLocationHasMacro(SL, Rewrite); + + const Expr* LHS = BO->getLHS(); + const Expr* RHS = BO->getRHS(); + + QualType LQT = LHS->getType(); + QualType RQT = RHS->getType(); + + const clang::Type* LTP = LQT.getTypePtr(); + const clang::Type* RTP = RQT.getTypePtr(); + + const clang::Type* CLTP = MR.Context->getCanonicalType(LTP); + const clang::Type* CRTP = MR.Context->getCanonicalType(RTP); + } + } + + private: + Rewriter &Rewrite; + MatchFinder Matcher; +}; /**********************************************************************************************************************/ /**********************************************************************************************************************/ class MyASTConsumer : public ASTConsumer { public: - MyASTConsumer(Rewriter &R) {} + MyASTConsumer(Rewriter &R) : HIfBreaker(R) + {} + + void HandleTranslationUnit(ASTContext &Context) override + { + Matcher.addMatcher(ifStmt(hasDescendant(expr(anyOf(unaryOperator().bind("uno"), binaryOperator().bind("dous"))))), &HIfBreaker); - void HandleTranslationUnit(ASTContext &Context) override { Matcher.matchAST(Context); } private: + IfBreaker HIfBreaker; MatchFinder Matcher; + Rewriter R; }; /**********************************************************************************************************************/ -class MyFrontendAction : public ASTFrontendAction { +class MyFrontendAction : public ASTFrontendAction +{ public: MyFrontendAction() {} - void EndSourceFileAction() override { + void EndSourceFileAction() override + { TheRewriter.getEditBuffer(TheRewriter.getSourceMgr().getMainFileID()).write(llvm::outs()); } - std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, StringRef file) override { + std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, StringRef file) override + { TheRewriter.setSourceMgr(CI.getSourceManager(), CI.getLangOpts()); return llvm::make_unique<MyASTConsumer>(TheRewriter); } @@ -84,10 +221,13 @@ private: }; /**********************************************************************************************************************/ /*Main*/ -int main(int argc, const char **argv) { +int main(int argc, const char **argv) +{ CommonOptionsParser op(argc, argv, BruiserCategory); ClangTool Tool(op.getCompilations(), op.getSourcePathList()); + bruiser::BruiserReport BruiseRep; + return Tool.run(newFrontendActionFactory<MyFrontendAction>().get()); } /*last line interntionally left blank.*/ diff --git a/bruiser/bruiser.h b/bruiser/bruiser.h index cf22e5e..fcfcaec 100644 --- a/bruiser/bruiser.h +++ b/bruiser/bruiser.h @@ -27,9 +27,57 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* /*included modules*/ /*project headers*/ /*standard library headers*/ +#include <string> +#include <fstream> +/*clang headers*/ +#include "clang/AST/ASTContext.h" +#include "clang/AST/Expr.h" +#include "clang/AST/Type.h" +#include "clang/AST/ASTTypeTraits.h" +/*llvm headers*/ + +/**********************************************************************************************************************/ +/*using*/ +using namespace llvm; +using namespace clang; +/**********************************************************************************************************************/ +namespace bruiser +{ +/**********************************************************************************************************************/ +/** + * @brief This class hanhles the logging for bruiser. + */ +class BruiserReport +{ + public: + BruiserReport (); + + ~BruiserReport(); + + bool PrintToLog(std::string __in_arg); + + private: + std::ofstream BruiserLog; +}; +/**********************************************************************************************************************/ +/** + * @brief looks through types. + */ +class TypeInfo +{ + public: + explicit TypeInfo(const clang::ast_type_traits::DynTypedNode* __dtn); + + ~TypeInfo(); + + const clang::Type* getTypeInfo(clang::ASTContext* __astc); + + private: + const clang::ast_type_traits::DynTypedNode* DTN; +}; /**********************************************************************************************************************/ -/*externals*/ /**********************************************************************************************************************/ +} // end of namespace bruiser #endif /*last line intentionally left balnk.*/ diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp index 6a37c01..3aa55c5 100644 --- a/mutator-lvl0.cpp +++ b/mutator-lvl0.cpp @@ -8116,20 +8116,12 @@ public: DiagnosticsEngine &DiagEngine = CI.getPreprocessor().getDiagnostics(); -#if 0 - std::unique_ptr<Mutator0DiagnosticConsumer> M0DiagConsumer(new Mutator0DiagnosticConsumer); -#endif - -#if 0 +#if 1 Mutator0DiagnosticConsumer* M0DiagConsumer = new Mutator0DiagnosticConsumer; DiagEngine.setClient(M0DiagConsumer, true); #endif -#if 0 - const IdentifierTable &IT [[maybe_unused]] = CI.getPreprocessor().getIdentifierTable(); -#endif - TheRewriter.setSourceMgr(CI.getSourceManager(), CI.getLangOpts()); return llvm::make_unique<MyASTConsumer>(TheRewriter); } diff --git a/mutator_aux.cpp b/mutator_aux.cpp index 9153004..9eac0dd 100644 --- a/mutator_aux.cpp +++ b/mutator_aux.cpp @@ -36,7 +36,7 @@ using namespace clang; namespace Devi { /*a simple function that checks the sourcelocations for a macro expansion. returns the sourcelocation without macro expansion address.*/ -SourceLocation SourceLocationHasMacro (SourceLocation SL, Rewriter &Rewrite, std::string Kind) +SourceLocation SourceLocationHasMacro [[deprecated("doesnt work")]] (SourceLocation SL, Rewriter &Rewrite, std::string Kind) { /*does the sourcelocation include a macro expansion?*/ if ( SL.isMacroID() ) @@ -65,6 +65,18 @@ SourceLocation SourceLocationHasMacro (SourceLocation SL, Rewriter &Rewrite, std return (SL); } + +SourceLocation SourceLocationHasMacro(SourceLocation __sl, Rewriter &__rewrite) +{ + if (__sl.isMacroID()) + { + return __rewrite.getSourceMgr().getSpellingLoc(__sl); + } + else + { + return __sl; + } +} /*********************************************************************************************************************/ /*********************************************************************************************************************/ /*********************************************************************************************************************/ diff --git a/mutator_aux.h b/mutator_aux.h index 5385742..f1ad3fe 100644 --- a/mutator_aux.h +++ b/mutator_aux.h @@ -44,7 +44,9 @@ enum class Scope {NoValue, TU, Block}; enum class FunctionDeclKind {NoValue, Definition, Declaration}; /*********************************************************************************************************************/ -SourceLocation SourceLocationHasMacro (SourceLocation SL, Rewriter &Rewrite, std::string Kind); +SourceLocation SourceLocationHasMacro [[deprecated("doesnt work")]] (SourceLocation SL, Rewriter &Rewrite, std::string Kind); + +SourceLocation SourceLocationHasMacro(SourceLocation __sl, Rewriter &__rewrite); /*********************************************************************************************************************/ bool IsTheMatchInSysHeader(bool SysHeaderFlag, const ast_matchers::MatchFinder::MatchResult &MR, SourceLocation SL); diff --git a/mutator_report.cpp b/mutator_report.cpp index 94ddd6b..e61cb5d 100644 --- a/mutator_report.cpp +++ b/mutator_report.cpp @@ -257,9 +257,12 @@ void JSONReport::CloseReport(void) JSONRepFile.close(); } /*********************************************************************************************************************/ -/****************************************************End Of JSONReport************************************************/ +/*************************************************End Of JSONReport***************************************************/ +/*********************************************************************************************************************/ + /*********************************************************************************************************************/ /*End of namespace Devi*/ +/*********************************************************************************************************************/ } /*********************************************************************************************************************/ /*last line intentionally left blank.*/ diff --git a/mutator_report.h b/mutator_report.h index e621bcd..a1e955b 100644 --- a/mutator_report.h +++ b/mutator_report.h @@ -89,6 +89,7 @@ private: std::ofstream JSONRepFile; }; /*********************************************************************************************************************/ +/*********************************************************************************************************************/ /*end of namespace Devi*/ } #endif |