aboutsummaryrefslogtreecommitdiffstats
path: root/mutator-lvl0.cpp
diff options
context:
space:
mode:
authorbloodstalker <thabogre@gmail.com>2017-01-15 14:15:38 +0000
committerbloodstalker <thabogre@gmail.com>2017-01-15 14:15:38 +0000
commite7ed95353671564b8d96c46d40661923c940a102 (patch)
tree0d146e37ea862e9fbef02d11c5dba06697e7df14 /mutator-lvl0.cpp
parentthe sample action file (diff)
downloadmutator-e7ed95353671564b8d96c46d40661923c940a102.tar.gz
mutator-e7ed95353671564b8d96c46d40661923c940a102.zip
added 8.8. has false positives. tags incomplete types twice.
Diffstat (limited to 'mutator-lvl0.cpp')
-rw-r--r--mutator-lvl0.cpp197
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();