diff options
-rw-r--r-- | mutator-lvl0.cpp | 254 |
1 files changed, 243 insertions, 11 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp index 5082afb..1ab4f33 100644 --- a/mutator-lvl0.cpp +++ b/mutator-lvl0.cpp @@ -114,7 +114,7 @@ struct IdentInfo { IdentInfo(unsigned int iLine, unsigned int iColumn, std::string iFileName, std::string iName, \ std::string iSLString, Devi::NodeKind iNK, bool iIsIncomplete, Devi::FunctionDeclKind IFDKind, \ - Devi::Scope iScope, std::string iScopeFuncitonName, bool iIsValid) + Devi::Scope iScope, std::string iScopeFuncitonName, bool iIsValid, bool iIsStatic) { Line = iLine; Column = iColumn; @@ -127,6 +127,7 @@ struct IdentInfo Scope = iScope; ScopeFunctionName = iScopeFuncitonName; IsValid = iIsValid; + IsStatic = iIsStatic; } unsigned int Line; @@ -140,6 +141,7 @@ struct IdentInfo Devi::Scope Scope; std::string ScopeFunctionName; bool IsValid; + bool IsStatic; }; std::vector<IdentInfo> IdentInfoProto; @@ -4998,6 +5000,16 @@ public: SourceLocation SL = BN->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + const IdentifierInfo* II = BN->getIdentifier(); std::string Name = II->getName().str(); @@ -5006,7 +5018,7 @@ public: IdentInfo Temp = {SM->getSpellingLineNumber(SL), SM->getSpellingColumnNumber(SL), \ SM->getFilename(SL).str(), Name, SL.printToString(*SM), Devi::NodeKind::TypedefDecl, \ - false, Devi::FunctionDeclKind::NoValue, Devi::Scope::TU, "", true + false, Devi::FunctionDeclKind::NoValue, Devi::Scope::TU, "", true, false }; IdentInfoProto.push_back(Temp); @@ -5019,6 +5031,16 @@ public: SourceLocation SL = BN->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + const IdentifierInfo* II = BN->getIdentifier(); std::string Name; @@ -5048,7 +5070,7 @@ public: IdentInfo Temp = {SM->getSpellingLineNumber(SL), SM->getSpellingColumnNumber(SL), \ SM->getFilename(SL).str(), Name, SL.printToString(*SM), Devi::NodeKind::RecordDecl, \ - BN->getTypeForDecl()->isIncompleteType(), Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true + BN->getTypeForDecl()->isIncompleteType(), Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true, false }; IdentInfoProto.push_back(Temp); @@ -5061,6 +5083,16 @@ public: SourceLocation SL = BN->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + const IdentifierInfo* II = BN->getIdentifier(); std::string Name; @@ -5090,7 +5122,7 @@ public: IdentInfo Temp = {SM->getSpellingLineNumber(SL), SM->getSpellingColumnNumber(SL), \ SM->getFilename(SL).str(), Name, SL.printToString(*SM), Devi::NodeKind::FieldDecl, \ - false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true + false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true, false }; IdentInfoProto.push_back(Temp); @@ -5104,6 +5136,16 @@ public: SourceLocation SL = BN->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + const IdentifierInfo* II = BN->getIdentifier(); std::string Name; @@ -5133,7 +5175,7 @@ public: IdentInfo Temp = {SM->getSpellingLineNumber(SL), SM->getSpellingColumnNumber(SL), \ SM->getFilename(SL).str(), Name, SL.printToString(*SM), Devi::NodeKind::ParmVarDecl, \ - false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true + false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true, BN->isStaticLocal() }; IdentInfoProto.push_back(Temp); @@ -5146,6 +5188,16 @@ public: SourceLocation SL = BN->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + const IdentifierInfo* II = BN->getIdentifier(); std::string Name; @@ -5170,7 +5222,7 @@ public: IdentInfo Temp = {SM->getSpellingLineNumber(SL), SM->getSpellingColumnNumber(SL), \ SM->getFilename(SL).str(), Name, SL.printToString(*SM), Devi::NodeKind::FunctionDecl, \ - false, tempfkind, Devi::Scope::TU, "", true + false, tempfkind, Devi::Scope::TU, "", true, false }; IdentInfoProto.push_back(Temp); @@ -5183,6 +5235,16 @@ public: SourceLocation SL = BN->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + const IdentifierInfo* II = BN->getIdentifier(); std::string Name; @@ -5212,7 +5274,7 @@ public: IdentInfo Temp = {SM->getSpellingLineNumber(SL), SM->getSpellingColumnNumber(SL), \ SM->getFilename(SL).str(), Name, SL.printToString(*SM), Devi::NodeKind::VarDecl, \ - false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true + false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true, BN->isStaticLocal() }; IdentInfoProto.push_back(Temp); @@ -5225,6 +5287,16 @@ public: SourceLocation SL = BN->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + const IdentifierInfo* II = BN->getIdentifier(); std::string Name; @@ -5254,7 +5326,7 @@ public: IdentInfo Temp = {SM->getSpellingLineNumber(SL), SM->getSpellingColumnNumber(SL), \ SM->getFilename(SL).str(), Name, SL.printToString(*SM), Devi::NodeKind::EnumDecl, \ - false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true + false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true, false }; IdentInfoProto.push_back(Temp); @@ -5267,6 +5339,16 @@ public: SourceLocation SL = BN->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + const IdentifierInfo* II = BN->getIdentifier(); std::string Name; @@ -5296,7 +5378,7 @@ public: IdentInfo Temp = {SM->getSpellingLineNumber(SL), SM->getSpellingColumnNumber(SL), \ SM->getFilename(SL).str(), Name, SL.printToString(*SM), Devi::NodeKind::LabelDecl, \ - false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true + false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true, false }; IdentInfoProto.push_back(Temp); @@ -5309,6 +5391,16 @@ public: SourceLocation SL = BN->getLocStart(); SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start"); + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL)) + { + return void(); + } + + if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL)) + { + return void(); + } + const IdentifierInfo* II = BN->getIdentifier(); std::string Name; @@ -5338,7 +5430,7 @@ public: IdentInfo Temp = {SM->getSpellingLineNumber(SL), SM->getSpellingColumnNumber(SL), \ SM->getFilename(SL).str(), Name, SL.printToString(*SM), Devi::NodeKind::EnumConstDecl, \ - false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true + false, Devi::FunctionDeclKind::NoValue, tempscope, FunctionName, true, false }; IdentInfoProto.push_back(Temp); @@ -6599,15 +6691,21 @@ public: onEndOfAllTUs() {} /*end of 8.8*/ /*@DEVI-start of 5.x*/ + /*@DEVI-first we need to do some cleanup and mark some entries as invalid.*/ for (auto &iter : IdentInfoProto) { + if (iter.Name == "") + { + iter.IsValid = false; + } + if (iter.NK == Devi::NodeKind::RecordDecl) { for (auto &yaiter : IdentInfoProto) { if (iter.Name == yaiter.Name && iter.SLString != yaiter.SLString) { - if ((iter.IsIncomplete != yaiter.IsIncomplete) && iter.IsValid == true && yaiter.IsValid == true) + if ((iter.IsIncomplete != yaiter.IsIncomplete) && iter.IsValid && yaiter.IsValid) { iter.IsValid = false; } @@ -6619,6 +6717,140 @@ public: onEndOfAllTUs() {} } } } + + if (iter.NK == Devi::NodeKind::FieldDecl) + { + for (auto &yaiter : IdentInfoProto) + { + if (iter.Name == yaiter.Name && iter.SLString == yaiter.SLString && yaiter.NK == Devi::NodeKind::VarDecl) + { + yaiter.IsValid = false; + } + } + } + + if (iter.NK == Devi::NodeKind::ParmVarDecl) + { + for (auto &yaiter : IdentInfoProto) + { + if (iter.Name == yaiter.Name && iter.SLString == yaiter.SLString && yaiter.NK == Devi::NodeKind::VarDecl) + { + yaiter.IsValid = false; + } + } + } + + if (iter.NK == Devi::NodeKind::FunctionDecl) + { + for (auto &yaiter : IdentInfoProto) + { + if (iter.Name == yaiter.Name && iter.SLString != yaiter.SLString) + { + if (iter.FDKind != yaiter.FDKind && iter.IsValid && yaiter.IsValid) + { + iter.IsValid = false; + } + } + } + } + } + + /*@DEVI-now we can start looking for things to tag*/ + for (auto &iter : IdentInfoProto) + { + if (iter.IsValid == false) + { + continue; + } + + for (auto &yaiter : IdentInfoProto) + { + if (yaiter.IsValid == false) + { + continue; + } + + if (iter.Name == yaiter.Name && iter.SLString != yaiter.SLString) + { + /*tag 5.7*/ + std::cout << "5.7:" << "Identifier re-used:"; + std::cout << iter.SLString << ":" << iter.Name << ":" << yaiter.SLString << std::endl; + + XMLDocOut.XMLAddNode(iter.Line, iter.Column, iter.FileName, "5.7", "Identifier re-used:"); + JSONDocOUT.JSONAddElement(iter.Line, iter.Column, iter.FileName, "5.7", "Identifier re-used:"); + + if (iter.NK == Devi::NodeKind::TypedefDecl) + { + /*tag 5.3*/ + std::cout << "5.3:" << "Typedef identifier is not unique:"; + std::cout << iter.SLString << ":" << iter.Name << ":" << yaiter.SLString << std::endl; + + XMLDocOut.XMLAddNode(iter.Line, iter.Column, iter.FileName, "5.3", "Typedef identifier is not unique:"); + JSONDocOUT.JSONAddElement(iter.Line, iter.Column, iter.FileName, "5.3", "Typedef identifier is not unique:"); + } + + if (iter.NK == Devi::NodeKind::RecordDecl) + { + /*tag 5.4*/ + std::cout << "5.4:" << "Tag identifier is not unique:"; + std::cout << iter.SLString << ":" << iter.Name << ":" << yaiter.SLString << std::endl; + + XMLDocOut.XMLAddNode(iter.Line, iter.Column, iter.FileName, "5.4", "Tag identifier is not unique:"); + JSONDocOUT.JSONAddElement(iter.Line, iter.Column, iter.FileName, "5.4", "Tag identifier is not unique:"); + } + + if (iter.NK == Devi::NodeKind::RecordDecl && yaiter.NK != Devi::NodeKind::RecordDecl) + { + /*tag 5.6*/ + std::cout << "5.6:" << "The Identifier is re-used in another namespace:"; + std::cout << iter.SLString << ":" << iter.Name << ":" << yaiter.SLString << std::endl; + + XMLDocOut.XMLAddNode(iter.Line, iter.Column, iter.FileName, "5.6", "The Identifier is re-used in another namespace:"); + JSONDocOUT.JSONAddElement(iter.Line, iter.Column, iter.FileName, "5.6", "The Identifier is re-used in another namespace:"); + } + + if (iter.NK == Devi::NodeKind::LabelDecl && yaiter.NK != Devi::NodeKind::LabelDecl) + { + /*tag 5.6*/ + std::cout << "5.6:" << "The Identifier is re-used in another namespace:"; + std::cout << iter.SLString << ":" << iter.Name << ":" << yaiter.SLString << std::endl; + + XMLDocOut.XMLAddNode(iter.Line, iter.Column, iter.FileName, "5.6", "The Identifier is re-used in another namespace:"); + JSONDocOUT.JSONAddElement(iter.Line, iter.Column, iter.FileName, "5.6", "The Identifier is re-used in another namespace:"); + } + + if (((iter.NK != Devi::NodeKind::RecordDecl) && (iter.NK != Devi::NodeKind::LabelDecl)) && \ + ((yaiter.NK == Devi::NodeKind::RecordDecl) || (yaiter.NK == Devi::NodeKind::LabelDecl))) + { + /*tag 5.6*/ + std::cout << "5.6:" << "The Identifier is re-used in another namespace:"; + std::cout << iter.SLString << ":" << iter.Name << ":" << yaiter.SLString << std::endl; + + XMLDocOut.XMLAddNode(iter.Line, iter.Column, iter.FileName, "5.6", "The Identifier is re-used in another namespace:"); + JSONDocOUT.JSONAddElement(iter.Line, iter.Column, iter.FileName, "5.6", "The Identifier is re-used in another namespace:"); + } + + if (iter.FileName == yaiter.FileName && iter.Scope == Devi::Scope::Block && yaiter.Scope == Devi::Scope::TU) + { + /*tag 5.2*/ + std::cout << "5.2:" << "This identifier is being hidden by an identifier of the same name in file scope:"; + std::cout << iter.SLString << ":" << iter.Name << ":" << yaiter.SLString << std::endl; + + XMLDocOut.XMLAddNode(iter.Line, iter.Column, iter.FileName, "5.2", "This identifier is being hidden by an identifier of the same name in file scope:"); + JSONDocOUT.JSONAddElement(iter.Line, iter.Column, iter.FileName, "5.2", "This identifier is being hidden by an identifier of the same name in file scope:"); + } + + if (iter.IsStatic) + { + /*tag 5.5*/ + std::cout << "5.5:" << "Identifier with static storage duration is re-used:"; + std::cout << iter.SLString << ":" << iter.Name << ":" << yaiter.SLString << std::endl; + + XMLDocOut.XMLAddNode(iter.Line, iter.Column, iter.FileName, "5.5", "Identifier with static storage duration is re-used:"); + JSONDocOUT.JSONAddElement(iter.Line, iter.Column, iter.FileName, "5.5", "Identifier with static storage duration is re-used:"); + } + } + } } /*end of 5.x*/ } |