diff options
-rw-r--r-- | mutator-lvl0.cpp | 109 |
1 files changed, 108 insertions, 1 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp index 3be04cb..e31f3bf 100644 --- a/mutator-lvl0.cpp +++ b/mutator-lvl0.cpp @@ -2085,6 +2085,8 @@ public: ast_type_traits::ASTNodeKind ParentNodeKind = ParentNode.getNodeKind(); std::string StringKind = ParentNodeKind.asStringRef().str(); + + const ImplicitCastExpr* ParentICE = ParentNode.get<clang::ImplicitCastExpr>(); #endif CastKind CK = ICE->getCastKind(); @@ -2114,6 +2116,14 @@ public: } } + if (CK == CK_IntegralToFloating || CK == CK_FloatingToIntegral) + { + std::cout << "10.1/2 : " << "ImplicitCastExpr : Conversion of FloatingType to or from IntegralType is recommended against: " << std::endl; + std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl; + + XMLDocOut.XMLAddNode(MR.Context, SL, "10.1/2", "ImplicitCastExpr : Conversion of FloatingType to or from IntegralType is recommended against: "); + } + if ((CK == CK_IntegralToPointer) || (CK == CK_PointerToIntegral)) { std::cout << "11.3 : " << "ImplicitCastExpr : Conversion of PointerType to or from IntegralType is recommended against: " << std::endl; @@ -2715,6 +2725,98 @@ private: Rewriter &Rewrite; }; /**********************************************************************************************************************/ +class MCATC101 : public MatchFinder::MatchCallback +{ +public: + MCATC101 (Rewriter &Rewrite) : Rewrite(Rewrite) {} + + virtual void run(const MatchFinder::MatchResult &MR) + { + /*underdev*/ + if (MR.Nodes.getNodeAs<clang::ImplicitCastExpr>("atcdaddy") != nullptr) + { + const ImplicitCastExpr* ICE = MR.Nodes.getNodeAs<clang::ImplicitCastExpr>("atcdaddy"); + + if ((ICE->getCastKind() == CK_IntegralCast) || (ICE->getCastKind() == CK_FloatingCast)) + { + SourceLocation SL = ICE->getLocStart(); + SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + + ASTContext *const ASTC = MR.Context; + + QualType QTDaddy = ICE->getType(); + QualType QTKiddy; + + if (MR.Nodes.getNodeAs<clang::BinaryOperator>("atcdous") != nullptr) + { + const BinaryOperator* ChildNode = MR.Nodes.getNodeAs<clang::BinaryOperator>("atcdous"); + QTKiddy = ChildNode->getType(); + } + + if (MR.Nodes.getNodeAs<clang::UnaryOperator>("atcuno") != nullptr) + { + const UnaryOperator* ChildNode = MR.Nodes.getNodeAs<clang::UnaryOperator>("atcuno"); + QTKiddy = ChildNode->getType(); + } + + if (MR.Nodes.getNodeAs<clang::ParenExpr>("atcparens") != nullptr) + { + const ParenExpr* ChildNode = MR.Nodes.getNodeAs<clang::ParenExpr>("atcparens"); + QTKiddy = ChildNode->getType(); + } + + if (MR.Nodes.getNodeAs<clang::ImplicitCastExpr>("atckidice") != nullptr) + { + const ImplicitCastExpr* ChildNode = MR.Nodes.getNodeAs<clang::ImplicitCastExpr>("atckidice"); + QTKiddy = ChildNode->getType(); + } + + if (MR.Nodes.getNodeAs<clang::CStyleCastExpr>("atccstyle") != nullptr) + { + const CStyleCastExpr* ChildNode = MR.Nodes.getNodeAs<clang::CStyleCastExpr>("atccstyle"); + QTKiddy = ChildNode->getType(); + } + + const clang::Type* TPDaddy = QTDaddy.getTypePtr(); + const clang::Type* TPChild = QTKiddy.getTypePtr(); + + const clang::Type* CanonTypeDaddy = ASTC->getCanonicalType(TPDaddy); + const clang::Type* CanonTypeChild = ASTC->getCanonicalType(TPChild); + + uint64_t ICETypeSize = ASTC->getTypeSize(CanonTypeDaddy); + uint64_t ChildTypeSize = ASTC->getTypeSize(CanonTypeChild); + + bool ICETypeIsSignedInt = CanonTypeDaddy->getAsPlaceholderType()->isSignedInteger(); + bool ChildTypeIsSignedInt = CanonTypeChild->getAsPlaceholderType()->isSignedInteger(); + + bool ICETypeIsUSignedInt = CanonTypeDaddy->getAsPlaceholderType()->isUnsignedInteger(); + bool ChildTypeIsUSignedInt = CanonTypeChild->getAsPlaceholderType()->isUnsignedInteger(); + + if (CanonTypeDaddy->getAsPlaceholderType()->isInteger() && CanonTypeChild->getAsPlaceholderType()->isInteger()) + { + if ((ICETypeIsSignedInt && ChildTypeIsUSignedInt) || (ICETypeIsUSignedInt && ChildTypeIsSignedInt)) + { + std::cout << "10.1/2 : " << "ImplicitCastExpr changes the signedness of the type: " << std::endl; + std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl; + + XMLDocOut.XMLAddNode(MR.Context, SL, "10.1/2", "ImplicitCastExpr changes the signedness of the type: "); + } + } + + if (ICETypeSize < ChildTypeSize) + { + std::cout << "10.1/2 : " << "ImplicitCastExpr is narrowing: " << std::endl; + std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl; + + XMLDocOut.XMLAddNode(MR.Context, SL, "10.1/2", "ImplicitCastExpr is narrowing: "); + } + } + } + } + +private: + Rewriter &Rewrite; +}; /**********************************************************************************************************************/ /**********************************************************************************************************************/ /**********************************************************************************************************************/ @@ -3170,7 +3272,7 @@ public: HandlerForCF145(R), HandlerForCF146(R), HandlerForCF147(R), HandlerForCF148(R), HandlerForSwitch154(R), HandlerForPTC111(R), \ HandlerForCSE137(R), HandlerForDCDF810(R), HandlerForFunction165(R), HandlerForFunction1652(R), HandlerForPointer171(R), \ HandlerForPointer1723(R), HandlerForPointer174(R), HandlerForPointer175(R), HandlerForTypes61(R), HandlerForSU181(R), \ - HandlerForMCPTCCSTYLE(R) { + HandlerForMCPTCCSTYLE(R), HandlerForATC101(R) { /*forstmts whithout a compound statement.*/ Matcher.addMatcher(forStmt(unless(hasDescendant(compoundStmt()))).bind("mcfor"), &HandlerForCmpless); @@ -3344,6 +3446,10 @@ public: Matcher.addMatcher(recordDecl(isStruct()).bind("mcsu181struct"), &HandlerForSU184); Matcher.addMatcher(cStyleCastExpr().bind("mcptc11cstyle"), &HandlerForMCPTCCSTYLE); + + Matcher.addMatcher(implicitCastExpr(has(expr(anyOf(binaryOperator().bind("atcdous"), unaryOperator().bind("atcuno"), \ + parenExpr().bind("atcparens"), implicitCastExpr().bind("atckidice"), \ + cStyleCastExpr().bind("atccstyle"))))).bind("atcdaddy"), &HandlerForATC101); } void HandleTranslationUnit(ASTContext &Context) override { @@ -3406,6 +3512,7 @@ private: MCTypes61 HandlerForTypes61; MCSU181 HandlerForSU181; MCPTC11CSTYLE HandlerForMCPTCCSTYLE; + MCATC101 HandlerForATC101; MatchFinder Matcher; }; /**********************************************************************************************************************/ |