diff options
-rw-r--r-- | mutator-lvl0.cpp | 197 |
1 files changed, 135 insertions, 62 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp index 4f816fb..b5b90a6 100644 --- a/mutator-lvl0.cpp +++ b/mutator-lvl0.cpp @@ -55,6 +55,8 @@ std::vector<SourceLocation> MacroUndefSourceLocation; std::vector<std::string> MacroNameString; std::vector<std::string> IncludeFileArr; +/**********************************************************************************************************************/ +/*@DEVI-struct for nullstmt*/ struct NullStmtInfo { NullStmtInfo (unsigned iColumn, unsigned iLine, std::string iFileName, bool iIsInMainFile, bool iIsInSysHeader) @@ -74,6 +76,39 @@ struct NullStmtInfo }; std::vector<NullStmtInfo> NullStmtProto; +/**********************************************************************************************************************/ +/*@DEVI-struct used for 8.8*/ +struct ExternObjInfo +{ + ExternObjInfo(unsigned int iLineNumber, unsigned int iColumnNumber, std::string iFileName\ + , std::string iXObjSLStr, std::string iXObjNameStr, FileID iXObjFID \ + , bool iHasMoreThanOneDefinition, bool iIsDefinition, bool iIsDeclaration) + { + LineNumber = iLineNumber; + ColumnNumber = iColumnNumber; + FileName = iFileName; + XObjSLStr = iXObjSLStr; + XObjNameStr = iXObjNameStr; + XObjFID = iXObjFID; + HasMoreThanOneDefinition = iHasMoreThanOneDefinition; + IsDefinition = iIsDefinition; + IsDeclaration = iIsDeclaration; + } + + unsigned int LineNumber; + unsigned int ColumnNumber; + std::string FileName; + std::string XObjSLStr; + std::string XObjNameStr; + FileID XObjFID; + bool HasMoreThanOneDefinition; + bool IsDefinition; + bool IsDeclaration; +}; + +std::vector<ExternObjInfo> ExternObjInfoProto; +/*@DEVI-end*/ +/**********************************************************************************************************************/ /*mutator-lvl0 executable options*/ enum MisraC @@ -4241,104 +4276,116 @@ private: Rewriter &Rewrite; }; /**********************************************************************************************************************/ -/*@DEVI-flags all external functions that have a declaration that is not a definition also.*/ +/*@DEVI-has false positives will tag incomplete types if they are later declared as complete types.*/ class [[maybe_unused]] MCDCDF88 : public MatchFinder::MatchCallback { public: - MCDCDF88 (Rewriter &Rewrite) : Rewrite(Rewrite) - { - IsNewEntry = true; - } + MCDCDF88 (Rewriter &Rewrite) : Rewrite(Rewrite) {} virtual void run(const MatchFinder::MatchResult &MR) { - if (MR.Nodes.getNodeAs<clang::NamedDecl>("mcdcdf88") != nullptr) - { - IsNewEntry = true; + bool IsNewEntry = true; - const NamedDecl* ND = MR.Nodes.getNodeAs<clang::NamedDecl>("mcdcdf88"); + if (MR.Nodes.getNodeAs<clang::VarDecl>("mcdcdf88var") != nullptr) + { + const VarDecl* VD = MR.Nodes.getNodeAs<clang::VarDecl>("mcdcdf88var"); - SourceLocation SL = ND->getLocStart(); + SourceLocation SL = VD->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); ASTContext* const ASTC = MR.Context; - std::string NDNameString = ND->getNameAsString(); - FullSourceLoc FSL = ASTC->getFullLoc(SL); + const SourceManager &SM = FSL.getManager(); + + if (!SM.isInMainFile(SL)) + { + return void(); + } + + std::string NDNameString = VD->getNameAsString(); + for (auto &iter : ExternObjInfoProto) { + std::cout << "diagnostic2:" << "Variable:" << NDNameString << ":" << iter.XObjNameStr << std::endl; if (iter.XObjNameStr == NDNameString) { IsNewEntry = false; - if (iter.XObjFID != FSL.getFileID()) - { - iter.HasMoreThanOneDefinition = true; - } + iter.HasMoreThanOneDefinition = true; } } if (IsNewEntry) { - ExternObjInfo Temp = {SL, SL.printToString(*MR.SourceManager), FSL, NDNameString, FSL.getFileID(), false}; + const SourceManager &SM = FSL.getManager(); + + ExternObjInfo Temp = {FSL.getSpellingLineNumber(), FSL.getSpellingColumnNumber(), \ + SM.getFilename(SL), SL.printToString(*MR.SourceManager), NDNameString, \ + FSL.getFileID(), false, false, false + }; ExternObjInfoProto.push_back(Temp); } } - } - virtual void onEndOfTranslationUnit() - { - for (auto &iter : ExternObjInfoProto) + if (MR.Nodes.getNodeAs<clang::FunctionDecl>("mcdcdf88function") != nullptr) { - if (iter.HasMoreThanOneDefinition) + const FunctionDecl* FD = MR.Nodes.getNodeAs<clang::FunctionDecl>("mcdcdf88function"); + + SourceLocation SL = FD->getLocStart(); + SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + + ASTContext* const ASTC = MR.Context; + + std::string NDNameString = FD->getNameAsString(); + + FullSourceLoc FSL = ASTC->getFullLoc(SL); + + const SourceManager &SM = FSL.getManager(); + + if (!SM.isInMainFile(SL)) { -#if 1 - if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, iter.XObjFSL.isInSystemHeader(), iter.XObjSL)) - { - /*intentionally left blank*/ - } - else + return void(); + } + + for (auto &iter : ExternObjInfoProto) + { + if (iter.XObjNameStr == NDNameString) { - if (Devi::IsTheMatchInMainFile(MainFileOnly, iter.XObjFSL.getManager().isInMainFile(iter.XObjSL), iter.XObjSL)) + IsNewEntry = false; + + + if ((iter.IsDefinition == true && FD->isThisDeclarationADefinition()) || (iter.IsDeclaration == true && !FD->isThisDeclarationADefinition())) { - std::cout << "8.8:" << "External function or object (" + iter.XObjNameStr + ") is defined in more than one file:"; - std::cout << iter.XObjSLStr << ":" << std::endl; + iter.HasMoreThanOneDefinition = true; - XMLDocOut.XMLAddNode(iter.XObjFSL, iter.XObjSL, "8.8", "External function or object (" + iter.XObjNameStr + ") is defined in more than one file: "); - JSONDocOUT.JSONAddElement(iter.XObjFSL, iter.XObjSL, "8.8", "External function or object (" + iter.XObjNameStr + ") is defined in more than one file: "); + if (FD->isThisDeclarationADefinition()) + { + iter.IsDefinition = true; + } + else + { + iter.IsDeclaration = true; + } } + } -#endif + } + + if (IsNewEntry) + { + ExternObjInfo Temp = {FSL.getSpellingLineNumber(), FSL.getSpellingColumnNumber(), \ + SM.getFilename(SL), SL.printToString(*MR.SourceManager), NDNameString, \ + FSL.getFileID(), false, FD->isThisDeclarationADefinition(), !FD->isThisDeclarationADefinition() + }; + ExternObjInfoProto.push_back(Temp); } } } private: - struct ExternObjInfo - { - ExternObjInfo(SourceLocation iXObjSL, std::string iXObjSLStr, FullSourceLoc iXObjFSL, std::string iXObjNameStr, FileID iXObjFID , bool iHasMoreThanOneDefinition) - { - XObjSL = iXObjSL; - XObjSLStr = iXObjSLStr; - XObjFSL = iXObjFSL; - XObjNameStr = iXObjNameStr; - XObjFID = iXObjFID; - HasMoreThanOneDefinition = iHasMoreThanOneDefinition; - } - - SourceLocation XObjSL; - std::string XObjSLStr; - FullSourceLoc XObjFSL; - std::string XObjNameStr; - FileID XObjFID; - bool HasMoreThanOneDefinition; - }; - - std::vector<ExternObjInfo> ExternObjInfoProto; - - bool IsNewEntry; + /*@DEVI-the structure that holds the values is global since we need it to survive through all the TUs.*/ Rewriter &Rewrite; }; @@ -6201,6 +6248,29 @@ public: private: }; /**********************************************************************************************************************/ +class onEndOfAllTUs +{ +public: onEndOfAllTUs() {} + + static void run(void) + { + /*@DEVI-start of 8.8*/ + for (auto &iter : ExternObjInfoProto) + { + if (iter.HasMoreThanOneDefinition) + { + std::cout << "8.8:" << "External function or object (" + iter.XObjNameStr + ") is defined in more than one file:"; + std::cout << iter.XObjSLStr << ":" << std::endl; + + XMLDocOut.XMLAddNode(iter.LineNumber, iter.ColumnNumber, iter.FileName, "8.8", "External function or object (" + iter.XObjNameStr + ") is defined in more than one file: "); + JSONDocOUT.JSONAddElement(iter.LineNumber, iter.ColumnNumber, iter.FileName, "8.8", "External function or object (" + iter.XObjNameStr + ") is defined in more than one file: "); + } + } + /*end of 8.8*/ + } + +private: +}; /**********************************************************************************************************************/ class MyASTConsumer : public ASTConsumer { @@ -6217,7 +6287,7 @@ public: 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), \ - HandlerForTypes612(R) { + HandlerForTypes612(R), HandlerForDCDF88(R) { #if 1 /*forstmts whithout a compound statement.*/ @@ -6329,7 +6399,8 @@ public: Matcher.addMatcher(callExpr(hasAncestor(functionDecl().bind("mcdcdf810daddy"))).bind("mcdcdf810"), &HandlerForDCDF810); - Matcher.addMatcher(functionDecl(allOf(returns(anything()), unless(returns(asString("void"))), hasBody(compoundStmt()) , unless(hasDescendant(returnStmt())))).bind("mcfunction165"), &HandlerForFunction165); + Matcher.addMatcher(functionDecl(allOf(returns(anything()), unless(returns(asString("void"))), hasBody(compoundStmt()) \ + , unless(hasDescendant(returnStmt())))).bind("mcfunction165"), &HandlerForFunction165); Matcher.addMatcher(functionDecl(allOf(parameterCountIs(0), hasBody(compoundStmt()))).bind("mcfunction1652"), &HandlerForFunction1652); @@ -6407,7 +6478,9 @@ public: Matcher.addMatcher(declRefExpr(allOf(hasAncestor(functionDecl().bind("mcdcdf87daddy")), \ to(varDecl(unless(hasAncestor(functionDecl()))).bind("mcdcdf87origin")))).bind("mcdcdfobj"), &HandlerForDCDF87); - //Matcher.addMatcher(namedDecl(hasExternalFormalLinkage()).bind("mcdcdf88"), &HandlerForDCDF88); + Matcher.addMatcher(functionDecl(hasExternalFormalLinkage()).bind("mcdcdf88function"), &HandlerForDCDF88); + + Matcher.addMatcher(varDecl(hasExternalFormalLinkage()).bind("mcdcdf88var"), &HandlerForDCDF88); Matcher.addMatcher(expr().bind("mclangx23"), &HandlerForLangX23); @@ -6498,9 +6571,7 @@ private: MCATC101 HandlerForATC101; MCIdent5 HandlerForIdent5; MCDCDF87 HandlerForDCDF87; -#if 0 MCDCDF88 HandlerForDCDF88; -#endif MCLangX23 HandlerForLangX23; MCFunction167 HandlerForFunction167; MCCF143 HandlerForCF143; @@ -6566,6 +6637,8 @@ int main(int argc, const char **argv) CheckForNull.Check(); + onEndOfAllTUs::run(); + XMLDocOut.SaveReport(); JSONDocOUT.CloseReport(); |