diff options
author | bloodstalker <thabogre@gmail.com> | 2017-01-12 19:09:12 +0000 |
---|---|---|
committer | bloodstalker <thabogre@gmail.com> | 2017-01-12 19:09:12 +0000 |
commit | 5833797cd3a35bd9258caaa879dfbd194916454a (patch) | |
tree | 9bd39e2c86a2825005df5c8e26b8688c9a2dfb19 | |
parent | updated 1/12/2017 (diff) | |
download | mutator-5833797cd3a35bd9258caaa879dfbd194916454a.tar.gz mutator-5833797cd3a35bd9258caaa879dfbd194916454a.zip |
added 6.1 and 6.2. the current implementation is quite smplistic. tdds were already added for 6.1 and 6.2.
Diffstat (limited to '')
-rw-r--r-- | mutator-lvl0.cpp | 72 |
1 files changed, 69 insertions, 3 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp index cb9bf26..9234c87 100644 --- a/mutator-lvl0.cpp +++ b/mutator-lvl0.cpp @@ -18,6 +18,7 @@ #include "clang/AST/ASTTypeTraits.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Expr.h" +#include "clang/AST/Type.h" #include "clang/ASTMatchers/ASTMatchers.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/Basic/OperatorKinds.h" @@ -4482,14 +4483,73 @@ private: Rewriter &Rewrite [[maybe_unused]]; }; /**********************************************************************************************************************/ -class MCTYpes612 : public MatchFinder::MatchCallback +/*@DEVI-the match is quite simplistic. we could match for chartypes appearing as the LHS and then check the type of +the RHS expr but that leaves pointers changing the value.*/ +class MCTypes612 : public MatchFinder::MatchCallback { public: - MCTYpes612 (Rewriter &Rewrite) : Rewrite(Rewrite) {} + MCTypes612 (Rewriter &Rewrite) : Rewrite(Rewrite) {} virtual void run(const MatchFinder::MatchResult &MR) { + if (MR.Nodes.getNodeAs<clang::Expr>("mc612exp") != nullptr) + { + bool RHSIsCharLit = false; + bool RHSIsIntLit = false; + + const Expr* LHS = MR.Nodes.getNodeAs<clang::Expr>("mc612exp"); + + if (MR.Nodes.getNodeAs<clang::CharacterLiteral>("mc612charlit") != nullptr) + { + RHSIsCharLit = true; + } + + if (MR.Nodes.getNodeAs<clang::IntegerLiteral>("mc612intlit") != nullptr) + { + RHSIsIntLit = true; + } + + SourceLocation SL = LHS->getLocStart(); + SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + + QualType QT = LHS->getType(); + const clang::Type* TP = QT.getTypePtr(); + + /*checking whether the unqualified type is simple char*/ + if (TP->isSpecificBuiltinType(BuiltinType::Kind::Char_U) || TP->isSpecificBuiltinType(BuiltinType::Kind::Char_S)) + { + if (RHSIsIntLit) + { + std::cout << "6.1:" << "Simple char type should only hold character values:"; + std::cout << SL.printToString(*MR.SourceManager) << ":" << std::endl; + + XMLDocOut.XMLAddNode(MR.Context, SL, "6.1", "Simple char type should only hold character values:"); + JSONDocOUT.JSONAddElement(MR.Context, SL, "6.1", "Simple char type should only hold character values:"); + } + } + + if (TP->isSpecificBuiltinType(BuiltinType::Kind::UChar) || TP->isSpecificBuiltinType(BuiltinType::Kind::SChar)) + { + if (RHSIsCharLit) + { + std::cout << "6.2:" << "Signed or unsigned char type should only hold numeric values:"; + std::cout << SL.printToString(*MR.SourceManager) << ":" << std::endl; + + XMLDocOut.XMLAddNode(MR.Context, SL, "6.2", "Signed or unsigned char type should only hold numeric values:"); + JSONDocOUT.JSONAddElement(MR.Context, SL, "6.2", "Signed or unsigned char type should only hold numeric values:"); + } + } + } } private: @@ -6152,7 +6212,8 @@ public: HandlerForCSE137(R), HandlerForDCDF810(R), HandlerForFunction165(R), HandlerForFunction1652(R), HandlerForPointer171(R), \ HandlerForPointer1723(R), HandlerForPointer174(R), HandlerForPointer175(R), HandlerForTypes61(R), HandlerForSU181(R), \ HandlerForMCPTCCSTYLE(R), HandlerForATC101(R), HandlerForIdent5(R), HandlerForDCDF87(R), HandlerForLangX23(R), \ - HandlerForFunction167(R), HandlerForCF143(R), HandlerForExpr1212(R), HandlerForExpr1211(R), HandlerForAtc105(R), HandlerForCSE135(R) { + HandlerForFunction167(R), HandlerForCF143(R), HandlerForExpr1212(R), HandlerForExpr1211(R), HandlerForAtc105(R), HandlerForCSE135(R), \ + HandlerForTypes612(R) { #if 1 /*forstmts whithout a compound statement.*/ @@ -6363,6 +6424,10 @@ public: Matcher.addMatcher(unaryOperator(allOf(hasOperatorName("~") , hasUnaryOperand(expr(hasType(isInteger())).bind("mcatc105lhs")))).bind("mcatc105uno"), &HandlerForAtc105); Matcher.addMatcher(forStmt().bind("mccse135"), &HandlerForCSE135); + + Matcher.addMatcher(binaryOperator(allOf(hasRHS(expr(has(expr(anyOf(integerLiteral().bind("mc612intlit"), \ + characterLiteral().bind("mc612charlit")))))), hasLHS(expr(hasType(isAnyCharacter())).bind("mc612exp")), \ + hasOperatorName("="))), &HandlerForTypes612); #endif } @@ -6439,6 +6504,7 @@ private: MCExpr1211 HandlerForExpr1211; MCATC105 HandlerForAtc105; MCCSE135 HandlerForCSE135; + MCTypes612 HandlerForTypes612; MatchFinder Matcher; }; /**********************************************************************************************************************/ |