aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoruser1 <user1@ubuntu>2017-04-14 19:31:35 +0000
committeruser1 <user1@ubuntu>2017-04-14 19:31:35 +0000
commit19129256402d71d41fbacaaf2fcea8cc64cb9fba (patch)
tree14ca6221c2c79fee2897c224fe5b0d4242cb6206
parentadded (simple, not necessarily general) translation of memset() (diff)
parentadded some more experimental stuff. right now bruiser can only hijack the main. (diff)
downloadmutator-19129256402d71d41fbacaaf2fcea8cc64cb9fba.tar.gz
mutator-19129256402d71d41fbacaaf2fcea8cc64cb9fba.zip
Merge branch 'master' of https://github.com/bloodstalker/mutator.git
-rw-r--r--README.md17
-rw-r--r--bruiser/bruiser.cpp225
-rw-r--r--bruiser/bruiser.h50
-rw-r--r--mutator-lvl0.cpp10
-rw-r--r--mutator_aux.cpp14
-rw-r--r--mutator_aux.h4
-rw-r--r--mutator_report.cpp5
-rw-r--r--mutator_report.h1
8 files changed, 305 insertions, 21 deletions
diff --git a/README.md b/README.md
index 91f6c68..6849750 100644
--- a/README.md
+++ b/README.md
@@ -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](http://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..439605b 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,239 @@ 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:
+ explicit MatcherHandlerLVL0 (Rewriter &Rewrite) : AbstractMatcherHandler(Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR) override
+ {
+
+ }
+
+ private:
+};
+/**********************************************************************************************************************/
+class NameFinder
+{
+ public:
+ NameFinder () {}
+
+ class runDeclRefExprMatcher
+ {
+ public:
+ runDeclRefExprMatcher (Rewriter &__rwrt) : LVL0Proto(__rwrt), __rwrt(__rwrt) {}
+
+ virtual void runMatcher(const StringRef __sr, ASTContext &__ctx)
+ {
+ Matcher.addMatcher(declRefExpr(to(namedDecl(hasName(__sr.str())))).bind("declrefexpbyname"), &LVL0Proto);
+ Matcher.matchAST(__ctx);
+ }
+
+ private:
+ MatchFinder Matcher;
+ MatcherHandlerLVL0 LVL0Proto;
+ Rewriter __rwrt;
+ StringRef __sr;
+ };
+
+ class runNamedDeclMatcher
+ {
+ public:
+ runNamedDeclMatcher (Rewriter &__rwrt) : LVL0Proto(__rwrt), __rwrt(__rwrt) {}
+
+ virtual void runMatcher(const StringRef __sr, ASTContext &__ctx)
+ {
+ Matcher.addMatcher(declRefExpr(to(namedDecl(hasName(__sr.str())))).bind("nameddeclbyname"), &LVL0Proto);
+ Matcher.matchAST(__ctx);
+ }
+
+ private:
+ MatchFinder Matcher;
+ MatcherHandlerLVL0 LVL0Proto;
+ Rewriter __rwrt;
+ StringRef __sr;
+ };
+
+ private:
+};
+/**********************************************************************************************************************/
+/**********************************************************************************************************************/
+/**********************************************************************************************************************/
+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);
+
+ }
+
+ 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;
+};
+/**********************************************************************************************************************/
+/**
+ * @brief Hijacks the main main and replaces it with bruiser's main.
+ */
+class MainWrapper : public MatchFinder::MatchCallback
+{
+public:
+ MainWrapper (Rewriter &Rewrite) : Rewrite(Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR)
+ {
+ if (MR.Nodes.getNodeAs<clang::FunctionDecl>("mainwrapper") != nullptr)
+ {
+ const FunctionDecl* FD = MR.Nodes.getNodeAs<clang::FunctionDecl>("mainwrapper");
+
+ SourceLocation SL = FD->getLocStart();
+ CheckSLValidity(SL);
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite);
+
+ SourceLocation SLE = FD->getLocEnd();
+ CheckSLValidity(SLE);
+ SLE = Devi::SourceLocationHasMacro(SLE, Rewrite);
+
+ SourceRange SR(SL, SLE);
+
+ std::string MainSig = Rewrite.getRewrittenText(SR);
+
+ size_t mainbegin = MainSig.find("main");
+
+ StringRef __sr("sub_main");
+
+ Rewrite.ReplaceText(SL.getLocWithOffset(mainbegin), 4U, __sr);
+
+ Rewrite.InsertTextAfter(SLE.getLocWithOffset(1U), StringRef("\n\nint main(int argc, const char **argv)\n{\n\tsub_main(argc, argv);\n}"));
+
+ //ruiseRep << "changed main main's name.\n"
+ }
+ }
+
+ private:
+ Rewriter &Rewrite;
+};
+/**********************************************************************************************************************/
/**********************************************************************************************************************/
/**********************************************************************************************************************/
class MyASTConsumer : public ASTConsumer {
public:
- MyASTConsumer(Rewriter &R) {}
+ MyASTConsumer(Rewriter &R) : HIfBreaker(R), HMainWrapper(R)
+ {}
+
+ void HandleTranslationUnit(ASTContext &Context) override
+ {
+ Matcher.addMatcher(ifStmt(hasDescendant(expr(anyOf(unaryOperator().bind("uno"), binaryOperator().bind("dous"))))), &HIfBreaker);
+
+ Matcher.addMatcher(functionDecl(hasName("main")).bind("mainwrapper"), &HMainWrapper);
- void HandleTranslationUnit(ASTContext &Context) override {
Matcher.matchAST(Context);
}
private:
+ IfBreaker HIfBreaker;
+ MainWrapper HMainWrapper;
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 +290,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