aboutsummaryrefslogtreecommitdiffstats
path: root/mutator-lvl0.cpp
diff options
context:
space:
mode:
authorbloodstalker <thabogre@gmail.com>2016-11-26 03:48:24 +0000
committerbloodstalker <thabogre@gmail.com>2016-11-26 03:48:24 +0000
commita6b8d2c02c43265d08d80f43c5038bb739599cb7 (patch)
tree50a6f74710aa5e6a69b8c53ed4ad029d196df871 /mutator-lvl0.cpp
parentadded tdd tests for 14.4. 14.5 already had some. (diff)
downloadmutator-a6b8d2c02c43265d08d80f43c5038bb739599cb7.tar.gz
mutator-a6b8d2c02c43265d08d80f43c5038bb739599cb7.zip
added 14.6,14.7 and 14.8
Diffstat (limited to 'mutator-lvl0.cpp')
-rw-r--r--mutator-lvl0.cpp188
1 files changed, 187 insertions, 1 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp
index 0c3a4be..d1b6f9a 100644
--- a/mutator-lvl0.cpp
+++ b/mutator-lvl0.cpp
@@ -47,8 +47,10 @@ public:
SourceLocation SL = FS->getLocStart();
SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+#if 0
std::cout << "14.8 : " << "\"For\" statement has no braces {}: " << std::endl;
std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+#endif
}
else
{
@@ -73,8 +75,10 @@ public:
SourceLocation SL = WS->getLocStart();
SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+#if 0
std::cout << "14.8 : " << "\"While\" statement has no braces {}: " << std::endl;
std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+#endif
}
else
{
@@ -1419,8 +1423,175 @@ private:
Rewriter &Rewrite;
};
/**********************************************************************************************************************/
+class MCCF146 : public MatchFinder::MatchCallback
+{
+public:
+ MCCF146 (Rewriter &Rewrite) : Rewrite(Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR)
+ {
+ if (MR.Nodes.getNodeAs<clang::ForStmt>("mccffofo") != nullptr)
+ {
+ const ForStmt* FS = MR.Nodes.getNodeAs<clang::ForStmt>("mccffofo");
+
+ SL = FS->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+ }
+
+ if (MR.Nodes.getNodeAs<clang::WhileStmt>("mccfwuwu") != nullptr)
+ {
+ const WhileStmt* WS = MR.Nodes.getNodeAs<clang::WhileStmt>("mccfwuwu");
+
+ SL = WS->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+ }
+
+ if (MR.Nodes.getNodeAs<clang::DoStmt>("mccfdodo") != nullptr)
+ {
+ const DoStmt* DS = MR.Nodes.getNodeAs<clang::DoStmt>("mccfdodo");
+
+ SL = DS->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+ }
+
+ NewSL = SL;
+
+ if (OldSL != NewSL)
+ {
+ AlreadyTagged = false;
+ BreakCounter = 1U;
+ }
+
+ if (OldSL == NewSL)
+ {
+ BreakCounter++;
+ }
+
+ if (BreakCounter >= 2U && !AlreadyTagged)
+ {
+ std::cout << "14.6 : " << "More than one BreakStmt used in the loop counter: " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+ AlreadyTagged = true;
+ }
+
+ OldSL = NewSL;
+ }
+
+private:
+ SourceLocation OldSL;
+ SourceLocation NewSL;
+ bool AlreadyTagged = false;
+ unsigned int BreakCounter = 0U;
+ SourceLocation SL;
+
+ Rewriter &Rewrite;
+};
/**********************************************************************************************************************/
+class MCCF147 : public MatchFinder::MatchCallback
+{
+public:
+ MCCF147 (Rewriter &Rewrite) : Rewrite(Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR)
+ {
+ if (MR.Nodes.getNodeAs<clang::FunctionDecl>("mccf147") != nullptr)
+ {
+ const FunctionDecl* FD = MR.Nodes.getNodeAs<clang::FunctionDecl>("mccf147");
+
+ SourceLocation SL = FD->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+
+ NewSL = SL;
+
+ if (OldSL != NewSL)
+ {
+ AlreadyTagged = false;
+ ReturnCounter = 1U;
+ }
+
+ if (OldSL == NewSL)
+ {
+ ReturnCounter++;
+ }
+
+ if (ReturnCounter >= 2U && !AlreadyTagged)
+ {
+ std::cout << "14.7 : " << "More than one ReturnStmt used in the body of FunctionDecl: " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+ AlreadyTagged = true;
+ }
+
+ OldSL = NewSL;
+ }
+ }
+
+private:
+ SourceLocation NewSL;
+ SourceLocation OldSL;
+ unsigned int ReturnCounter = 0U;
+ bool AlreadyTagged = false;
+
+ Rewriter &Rewrite;
+};
/**********************************************************************************************************************/
+class MCCF148 : public MatchFinder::MatchCallback
+{
+public:
+ MCCF148 (Rewriter &Rewrite) : Rewrite(Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR)
+ {
+
+ if (MR.Nodes.getNodeAs<clang::ForStmt>("mccf148for") != nullptr)
+ {
+ const ForStmt* FS = MR.Nodes.getNodeAs<clang::ForStmt>("mccf148for");
+
+ SL = FS->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+
+ std::cout << "14.8 : " << "ForStmt does not have a child CompoundStmt: " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+ }
+
+ if (MR.Nodes.getNodeAs<clang::WhileStmt>("mccf148while") != nullptr)
+ {
+ const WhileStmt* WS = MR.Nodes.getNodeAs<clang::WhileStmt>("mccf148while");
+
+ SL = WS->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+
+ std::cout << "14.8 : " << "WhileStmt does not have a child CompoundStmt: " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+ }
+
+ if (MR.Nodes.getNodeAs<clang::DoStmt>("mccf148do") != nullptr)
+ {
+ const DoStmt* DS = MR.Nodes.getNodeAs<clang::DoStmt>("mccf148do");
+
+ SL = DS->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+
+ std::cout << "14.8 : " << "DoStmt does not have a child CompoundStmt: " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+ }
+
+ if (MR.Nodes.getNodeAs<clang::SwitchStmt>("mccf148switch") != nullptr)
+ {
+ const SwitchStmt* SS = MR.Nodes.getNodeAs<clang::SwitchStmt>("mccf148switch");
+
+ SL = SS->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+
+ std::cout << "14.8 : " << "SwitchStmt does not have a child CompoundStmt: " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+ }
+ }
+
+private:
+ SourceLocation SL;
+
+ Rewriter &Rewrite;
+};
/**********************************************************************************************************************/
/**********************************************************************************************************************/
class MyASTConsumer : public ASTConsumer {
@@ -1433,7 +1604,7 @@ public:
HandlerForInit91(R), HandlerForInit92(R), HandlerForInit93(R), HandlerForExpr123(R), HandlerForExpr124(R), HandlerForExpr125(R), \
HandlerForExpr126(R), HandlerForExpr127(R), HandlerForExpr128(R), HandlerForExpr129(R), HandlerForExpr1210(R), HandlerForExpr1213(R), \
HandlerForCSE131(R), HandlerForCSE132(R), HandlerForCSE1332(R), HandlerForCSE134(R), HandlerForCSE136(R), HandlerForCF144(R), \
- HandlerForCF145(R) {
+ HandlerForCF145(R), HandlerForCF146(R), HandlerForCF147(R), HandlerForCF148(R) {
/*forstmts whithout a compound statement.*/
Matcher.addMatcher(forStmt(unless(hasDescendant(compoundStmt()))).bind("mcfor"), &HandlerForCmpless);
@@ -1523,6 +1694,18 @@ public:
Matcher.addMatcher(gotoStmt().bind("mccf144"), &HandlerForCF144);
Matcher.addMatcher(continueStmt().bind("mccf145"), &HandlerForCF145);
+
+ Matcher.addMatcher(breakStmt(hasAncestor(stmt(anyOf(forStmt().bind("mccffofo"), doStmt().bind("mccfdodo"), whileStmt().bind("mccfwuwu"))))), &HandlerForCF146);
+
+ Matcher.addMatcher(returnStmt(hasAncestor(functionDecl().bind("mccf147"))), &HandlerForCF147);
+
+ Matcher.addMatcher(forStmt(unless(has(compoundStmt()))).bind("mccf148for"), &HandlerForCF148);
+
+ Matcher.addMatcher(whileStmt(unless(has(compoundStmt()))).bind("mccf148while"), &HandlerForCF148);
+
+ Matcher.addMatcher(doStmt(unless(has(compoundStmt()))).bind("mccf148do"), &HandlerForCF148);
+
+ Matcher.addMatcher(switchStmt(unless(has(compoundStmt()))).bind("mccf148switch"), &HandlerForCF148);
}
void HandleTranslationUnit(ASTContext &Context) override {
@@ -1569,6 +1752,9 @@ private:
MCCSE136 HandlerForCSE136;
MCCF144 HandlerForCF144;
MCCF145 HandlerForCF145;
+ MCCF146 HandlerForCF146;
+ MCCF147 HandlerForCF147;
+ MCCF148 HandlerForCF148;
MatchFinder Matcher;
};
/**********************************************************************************************************************/