diff options
| -rw-r--r-- | mutator-lvl0.cpp | 198 | 
1 files changed, 192 insertions, 6 deletions
| diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp index e3c431a..553b06d 100644 --- a/mutator-lvl0.cpp +++ b/mutator-lvl0.cpp @@ -1334,18 +1334,19 @@ public:        const DeclRefExpr* DRE = MR.Nodes.getNodeAs<clang::DeclRefExpr>("mccse136kiddo");        const ForStmt* FS = MR.Nodes.getNodeAs<clang::ForStmt>("mccse136daddy"); -      const Stmt* FSS = FS->getInit(); +      const Stmt* FSInit = FS->getInit();        const Expr* FSInc = FS->getInc(); +      const Expr* FSCond = FS->getCond();        SourceLocation SLD = FS->getLocStart();        SLD = Devi::SourceLocationHasMacro(SLD, Rewrite, "start");        SourceLocation SL = DRE->getLocStart();        SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); -      if (FSS != nullptr && FSInc != nullptr) +      if (FSInit != nullptr && FSInc != nullptr)        { -        SourceLocation SLFSS = FSS->getLocStart(); -        SLFSS = Devi::SourceLocationHasMacro(SLFSS, Rewrite, "start"); +        SourceLocation SLFSInit = FSInit->getLocStart(); +        SLFSInit = Devi::SourceLocationHasMacro(SLFSInit, Rewrite, "start");          SourceLocation SLFSInc = FSInc->getLocStart();          SLFSInc = Devi::SourceLocationHasMacro(SLFSInc, Rewrite, "start"); @@ -1353,8 +1354,9 @@ public:          std::string NameString = DNI.getAsString(); +        /*JANKY*/          /*the third condition is put in place to accomodate the prefix unary increment or decrement operator.*/ -        if (SLFSS == SL || SLFSInc == SL || SLFSInc.getLocWithOffset(2) == SL) +        if (SLFSInit == SL || SLFSInc == SL || SLFSInc.getLocWithOffset(2) == SL)          {            ControlVarName = NameString;          } @@ -1616,6 +1618,180 @@ private:    Rewriter &Rewrite;  };  /**********************************************************************************************************************/ +class MCPTC111 : public MatchFinder::MatchCallback +{ +public: +  MCPTC111 (Rewriter &Rewrite) : Rewrite(Rewrite) {} + +  virtual void run(const MatchFinder::MatchResult &MR) +  { +    const DeclRefExpr* DRE = MR.Nodes.getNodeAs<clang::DeclRefExpr>("mcptc111"); + +    SourceLocation SL = DRE->getLocStart(); +    SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + +    ASTContext *const ASTC = MR.Context; + +    ASTContext::DynTypedNodeList NodeList = ASTC->getParents(*DRE); + +    /*assumptions:nothing has more than one parent in C.*/ +    ast_type_traits::DynTypedNode ParentNode = NodeList[0]; + +    ast_type_traits::ASTNodeKind ParentNodeKind = ParentNode.getNodeKind(); + +    std::string StringKind = ParentNodeKind.asStringRef().str(); + +    if (StringKind == "ImplicitCastExpr") +    { +      //ParentICE = ParentNode.get(); +      /*the tests for CastKind go here*/ +    } + +  } + +private: +  const clang::ImplicitCastExpr* ParentICE; +  Rewriter &Rewrite; +}; +/**********************************************************************************************************************/ +class MCCSE137 : public MatchFinder::MatchCallback +{ +public: +  MCCSE137 (Rewriter &Rewrite) : Rewrite(Rewrite) {} + +  virtual void run(const MatchFinder::MatchResult &MR) +  { +    if (MR.Nodes.getNodeAs<clang::Expr>("mccse137") != nullptr) +    { +      const Expr* EXP = MR.Nodes.getNodeAs<clang::Expr>("mccse137"); + +      SourceLocation SL = EXP->getLocStart(); +      SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + +      ASTContext *const ASTC = MR.Context; + +      if (EXP->isKnownToHaveBooleanValue()) +      { +        if (EXP->isEvaluatable(*ASTC, Expr::SE_NoSideEffects)) +        { +          std::cout << "13.7 : " << "EffectivelyBooleanExpr's result is known at compile-time: " << std::endl; +          std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl; +        } +      } +    } +  } + +private: +  Rewriter &Rewrite; +}; +/**********************************************************************************************************************/ +/*if the call is coming from another file, getdirectcalle returns the definition, +but if its coming from the same file, it returns the declaration that is not a definition.*/ +/*if youve already matched the definition, getdefinition returns null.*/ +class MCDCDF810 : public MatchFinder::MatchCallback +{ +public: +  MCDCDF810 (Rewriter &Rewrite) : Rewrite(Rewrite) +  { +    FuncScopeProto.push_back(FuncScope()); + +    VecC = 0U; +  } + +  virtual void run(const MatchFinder::MatchResult &MR) +  { +    if (MR.Nodes.getNodeAs<clang::CallExpr>("mcdcdf810") != nullptr && MR.Nodes.getNodeAs<clang::FunctionDecl>("mcdcdf810daddy") != nullptr) +    { +      AlreadyTagged = false; + +      const CallExpr* CE = MR.Nodes.getNodeAs<clang::CallExpr>("mcdcdf810"); +      const FunctionDecl* FDDad = MR.Nodes.getNodeAs<clang::FunctionDecl>("mcdcdf810daddy"); +      const FunctionDecl* FD = CE->getDirectCallee(); +      const FunctionDecl* FDDef = FD->getDefinition();; + +      if (FDDef == nullptr) +      { +        FDDef = CE->getDirectCallee(); +      } + +      SourceLocation CESL = CE->getLocStart(); +      CESL = Devi::SourceLocationHasMacro(CESL, Rewrite, "start"); +      SourceLocation FDDadSL = FDDad->getLocStart(); +      FDDadSL = Devi::SourceLocationHasMacro(FDDadSL, Rewrite, "start"); +      SourceLocation FDSL = FDDef->getLocStart(); +      FDSL = Devi::SourceLocationHasMacro(FDSL, Rewrite, "start"); + +      ASTContext *const ASTC = MR.Context; + +      FullSourceLoc FDDadFullSL = ASTC->getFullLoc(FDDadSL); +      FullSourceLoc FDFullSL = ASTC->getFullLoc(FDSL); + +      DeclarationNameInfo DNI = FDDef->getNameInfo(); +      std::string MatchedName = DNI.getAsString(); + +      /*going through the already matched functions,making sure we are not adding duplicates.*/ +      for (unsigned x = 0; x < VecC; ++x) +      { +        if (FuncScopeProto[x].FuncNameString == MatchedName && FuncScopeProto[x].DefinitionSL == FDSL.printToString(*MR.SourceManager)) +        { +          AlreadyTagged = true; + +          if (FDDef->isExternC()) +          { +            if (FDDadFullSL.getFileID() != FDFullSL.getFileID()) +            { +              FuncScopeProto[x].hasExternalCall = true; +            } +          } +        } +      } + +      if (AlreadyTagged == false && FDDef->isExternC()) +      { +        FuncScopeProto.push_back(FuncScope()); +        FuncScopeProto[VecC].FuncNameString = MatchedName; +        FuncScopeProto[VecC].DefinitionSL = FDSL.printToString(*MR.SourceManager); + +        if (FDDef->isExternC()) +        { +          if (FDDadFullSL.getFileID() != FDFullSL.getFileID()) +          { +            FuncScopeProto[VecC].hasExternalCall = true; +          } +        } + +        VecC++; +      } +    } +  } + +  virtual void onEndOfTranslationUnit() +  { +    for (unsigned x = 0; x < VecC; ++x) +    { +      if (FuncScopeProto[x].hasExternalCall == false) +      { +        std::cout << "8.10 : " << "Function does not have any external calls but is not declare as static : " << std::endl; +        std::cout << FuncScopeProto[x].DefinitionSL << "\n" << std::endl; +      } +    } +  } + +private: +  struct FuncScope { +    std::string FuncNameString; +    bool hasExternalCall = false; +    std::string DefinitionSL; +  }; + +  bool AlreadyTagged = false; + +  unsigned VecC; + +  std::vector<FuncScope> FuncScopeProto; + +  Rewriter &Rewrite; +};  /**********************************************************************************************************************/  /**********************************************************************************************************************/  /**********************************************************************************************************************/ @@ -1631,7 +1807,8 @@ 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), HandlerForCF146(R), HandlerForCF147(R), HandlerForCF148(R), HandlerForSwitch154(R) { +    HandlerForCF145(R), HandlerForCF146(R), HandlerForCF147(R), HandlerForCF148(R), HandlerForSwitch154(R), HandlerForPTC111(R), \ +    HandlerForCSE137(R), HandlerForDCDF810(R) {      /*forstmts whithout a compound statement.*/      Matcher.addMatcher(forStmt(unless(hasDescendant(compoundStmt()))).bind("mcfor"), &HandlerForCmpless); @@ -1735,6 +1912,12 @@ public:      Matcher.addMatcher(switchStmt(unless(has(compoundStmt()))).bind("mccf148switch"), &HandlerForCF148);      Matcher.addMatcher(switchStmt(hasCondition(expr().bind("mcswitch154"))).bind("mcswitch154daddy"), &HandlerForSwitch154); + +    Matcher.addMatcher(declRefExpr().bind("mcptc111"), &HandlerForPTC111); + +    Matcher.addMatcher(expr().bind("mccse137"), &HandlerForCSE137); + +    Matcher.addMatcher(callExpr(hasAncestor(functionDecl().bind("mcdcdf810daddy"))).bind("mcdcdf810"), &HandlerForDCDF810);    }    void HandleTranslationUnit(ASTContext &Context) override { @@ -1785,6 +1968,9 @@ private:    MCCF147 HandlerForCF147;    MCCF148 HandlerForCF148;    MCSwitch154 HandlerForSwitch154; +  MCPTC111 HandlerForPTC111; +  MCCSE137 HandlerForCSE137; +  MCDCDF810 HandlerForDCDF810;    MatchFinder Matcher;  };  /**********************************************************************************************************************/ | 
