aboutsummaryrefslogtreecommitdiffstats
path: root/mutator-lvl0.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mutator-lvl0.cpp')
-rw-r--r--mutator-lvl0.cpp194
1 files changed, 193 insertions, 1 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp
index 58c8c99..10c2a31 100644
--- a/mutator-lvl0.cpp
+++ b/mutator-lvl0.cpp
@@ -690,6 +690,185 @@ private:
Rewriter &Rewrite;
};
/**********************************************************************************************************************/
+/*Notes:clang does not let 8.2 and 8.3 through.*/
+/*clang gives the implicitly-typed vardecl and functiondecl a default type in the AST so we cant use that.
+we should just get the rewritten text and do string searches inside. thats the only way i can think of.*/
+class MCDCDF82 : public MatchFinder::MatchCallback
+{
+public:
+ MCDCDF82 (Rewriter &Rewrite) : Rewrite (Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR)
+ {
+ const VarDecl* VD = MR.Nodes.getNodeAs<clang::VarDecl>("mcdcdf82");
+
+ std::string QualifiedName = VD->getQualifiedNameAsString();
+
+ QualType QT = VD->getType();
+
+#if 0
+ std::cout << QualifiedName << "\n" << std::endl;
+#endif
+ }
+
+private:
+ Rewriter &Rewrite;
+};
+/**********************************************************************************************************************/
+/*this class also matches aggregate types. a simple aggregate check should fix that, if need be.*/
+class MCInit91 : public MatchFinder::MatchCallback
+{
+public:
+ MCInit91 (Rewriter &Rewrite) : Rewrite(Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR)
+ {
+ const VarDecl* VD = MR.Nodes.getNodeAs<clang::VarDecl>("mcinit91");
+
+ SourceLocation SL = VD->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+
+ /*we only check for local static since global static is meaningless.*/
+ if (!VD->isStaticLocal() && VD->isLocalVarDecl())
+ {
+ if (!VD->hasInit())
+ {
+ std::cout << "9.1 : " << "staic local variable does not have initialization : " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+ }
+ }
+
+ }
+
+private:
+ Rewriter &Rewrite;
+};
+/**********************************************************************************************************************/
+class MCInit92 : public MatchFinder::MatchCallback
+{
+public:
+ MCInit92 (Rewriter &Rewrite) : Rewrite(Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR)
+ {
+ const InitListExpr* ILE = MR.Nodes.getNodeAs<clang::InitListExpr>("mcinit92");
+ const VarDecl* VD = MR.Nodes.getNodeAs<clang::VarDecl>("mcinit92daddy");
+
+ SourceLocation SL = VD->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+
+ unsigned int NumInits = ILE->getNumInits();
+
+#if 0
+ std::cout << NumInits << "\n" << std::endl;
+#endif
+ }
+
+ virtual void onEndOfTranslationUnit()
+ {
+
+ }
+
+private:
+ Rewriter &Rewrite;
+};
+/**********************************************************************************************************************/
+class MCInit93 : public MatchFinder::MatchCallback
+{
+public:
+ MCInit93 (Rewriter &Rewrite) : Rewrite(Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR)
+ {
+ if (MR.Nodes.getNodeAs<clang::EnumConstantDecl>("mcinit93") != nullptr && MR.Nodes.getNodeAs<clang::EnumDecl>("mcinit93daddy") != nullptr)
+ {
+ const EnumConstantDecl * ECD = MR.Nodes.getNodeAs<clang::EnumConstantDecl>("mcinit93");
+ const EnumDecl* ED = MR.Nodes.getNodeAs<clang::EnumDecl>("mcinit93daddy");
+ /*do note that this pointer might very well be nullptr. we are actually counting on that.
+ it tells us we could not match an integer initialization for this enumconstantdecl.*/
+ const IntegerLiteral* IL = MR.Nodes.getNodeAs<clang::IntegerLiteral>("mcinit93kiddy");
+
+ SourceLocation SL = ED->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+ newSourceLocation = SL;
+
+ if (oldSourceLocation != newSourceLocation)
+ {
+ someoneHasInit = false;
+ everyoneHasInit = true;
+ isFirstElement = true;
+ if (IL == nullptr)
+ {
+ doesFirstElementHaveInit = false;
+ everyoneHasInit = false;
+ }
+ else
+ {
+ doesFirstElementHaveInit = true;
+ }
+ }
+ else
+ {
+ isFirstElement = false;
+ }
+
+ if (oldSourceLocation == newSourceLocation)
+ {
+ if (IL == nullptr)
+ {
+ everyoneHasInit = false;
+ }
+ else
+ {
+ someoneHasInit = true;
+ }
+
+ if (doesFirstElementHaveInit)
+ {
+ if (!everyoneHasInit && someoneHasInit)
+ {
+ /*in breach of misrac*/
+ std::cout << "9.3 : " << "first enumeration has integerliteral initialization but not all enumerations do : " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+ }
+ else
+ {
+ /*doesnt mean anything*/
+ }
+ }
+ else
+ {
+ if (IL != nullptr)
+ {
+ /*in breach of misrac*/
+ std::cout << "9.3 : " << "first enumeration does not have integerliteral initialization but at least one enumeration does : " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+ }
+ else
+ {
+ /*doesnt mean anything*/
+ }
+ }
+ }
+
+ oldSourceLocation = newSourceLocation;
+ }
+ }
+
+private:
+ /*doing this instead of saving everything and then running onendoftranslationunit is faster and less memory-expensive.
+ needless to say, for this to work, we are counting on clang's matching pattern.*/
+ SourceLocation oldSourceLocation;
+ SourceLocation newSourceLocation;
+
+ bool isFirstElement;
+ bool doesFirstElementHaveInit;
+ bool someoneHasInit = false;
+ bool everyoneHasInit = true;
+
+ Rewriter &Rewrite;
+};
+/**********************************************************************************************************************/
/**********************************************************************************************************************/
/**********************************************************************************************************************/
class MyASTConsumer : public ASTConsumer {
@@ -698,7 +877,8 @@ public:
MyASTConsumer(Rewriter &R) : HandlerForCmpless(R), HandlerWhileCmpless(R), HandlerElseCmpless(R), HandlerIfCmpless(R), \
HandlerForIfElse(R), HandlerForSwitchBrkLess(R), HandlerForSwitchDftLEss(R), HandlerForMCSwitch151(R), HandlerForMCSwitch155(R), \
HandlerForMCFunction161(R), HandlerForFunction162(R), HandlerForFunction164(R), HandlerForFunction166(R), HandlerForFunction168(R), \
- HandlerForFunction169(R), HandlerForPA171(R), HandlerForSU184(R), HandlerForType6465(R), HandlerForDCDF81(R) {
+ HandlerForFunction169(R), HandlerForPA171(R), HandlerForSU184(R), HandlerForType6465(R), HandlerForDCDF81(R), HandlerForDCDF82(R), \
+ HandlerForInit91(R), HandlerForInit92(R), HandlerForInit93(R) {
/*forstmts whithout a compound statement.*/
Matcher.addMatcher(forStmt(unless(hasDescendant(compoundStmt()))).bind("mcfor"), &HandlerForCmpless);
@@ -742,6 +922,14 @@ public:
Matcher.addMatcher(fieldDecl(isBitField()).bind("mctype6465"), &HandlerForType6465);
Matcher.addMatcher(functionDecl().bind("mcdcdf81"), &HandlerForDCDF81);
+
+ Matcher.addMatcher(varDecl().bind("mcdcdf82"), &HandlerForDCDF82);
+
+ Matcher.addMatcher(varDecl().bind("mcinit91"), &HandlerForInit91);
+
+ Matcher.addMatcher(initListExpr(hasAncestor(varDecl().bind("mcinit92daddy"))).bind("mcinit92"), &HandlerForInit92);
+
+ Matcher.addMatcher(enumConstantDecl(anyOf(allOf(hasDescendant(integerLiteral().bind("mcinit93kiddy")), hasAncestor(enumDecl().bind("mcinit93daddy"))), hasAncestor(enumDecl().bind("mcinit93daddy")))).bind("mcinit93"), &HandlerForInit93);
}
void HandleTranslationUnit(ASTContext &Context) override {
@@ -768,6 +956,10 @@ private:
MCSU184 HandlerForSU184;
MCTypes6465 HandlerForType6465;
MCDCDF81 HandlerForDCDF81;
+ MCDCDF82 HandlerForDCDF82;
+ MCInit91 HandlerForInit91;
+ MCInit92 HandlerForInit92;
+ MCInit93 HandlerForInit93;
MatchFinder Matcher;
};
/**********************************************************************************************************************/