aboutsummaryrefslogtreecommitdiffstats
path: root/mutator-lvl0.cpp
diff options
context:
space:
mode:
authorbloodstalker <thabogre@gmail.com>2016-12-03 10:28:18 +0000
committerbloodstalker <thabogre@gmail.com>2016-12-03 10:28:18 +0000
commit4862d4d5c06252576db331e7e008c91d0c6e350f (patch)
treed0868c04fdaf8adf8c3f10befd9a8cf9a73ff8f1 /mutator-lvl0.cpp
parentadded tdd tests for 19.10,19.12 and 19.13 (diff)
downloadmutator-4862d4d5c06252576db331e7e008c91d0c6e350f.tar.gz
mutator-4862d4d5c06252576db331e7e008c91d0c6e350f.zip
added quite a few more rule checks
Diffstat (limited to 'mutator-lvl0.cpp')
-rw-r--r--mutator-lvl0.cpp260
1 files changed, 258 insertions, 2 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp
index 1b580c6..57289de 100644
--- a/mutator-lvl0.cpp
+++ b/mutator-lvl0.cpp
@@ -38,6 +38,10 @@ using namespace clang::tooling;
/*global vars*/
Devi::XMLReport XMLDocOut;
+std::vector<SourceLocation> MacroDefSourceLocation;
+std::vector<SourceLocation> MacroUndefSourceLocation;
+std::vector<std::string> MacroNameString;
+
static llvm::cl::OptionCategory MatcherSampleCategory("Matcher Sample");
/**********************************************************************************************************************/
class MCForCmpless : public MatchFinder::MatchCallback {
@@ -475,6 +479,54 @@ public:
const FunctionDecl *FD = CE->getDirectCallee();
+ DeclarationNameInfo DNI = FD->getNameInfo();
+
+ std::string FuncNameString = DNI.getAsString();
+
+ ASTContext *const ASTC = MR.Context;
+
+ const SourceManager &SM = ASTC->getSourceManager();
+
+ /*start of 20.4*/
+ if ((FuncNameString == "malloc" || FuncNameString == "calloc" || FuncNameString == "free" || FuncNameString == "realloc") && SM.isInSystemHeader(FD->getLocStart()))
+ {
+ std::cout << "20.4 : " << "Dynamic heap memory allocation used: " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(MR.Context, SL, "20.4", "Dynamic heap memory allocation used: ");
+ }
+ /*end of 20.4*/
+
+ /*start of 20.7*/
+ if ((FuncNameString == "longjmp") && SM.isInSystemHeader(FD->getLocStart()))
+ {
+ std::cout << "20.7 : " << "Use of lonjmp is illegal: " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(MR.Context, SL, "20.7", "Use of longjmp is illegal: ");
+ }
+ /*end of 20.7*/
+
+ /*start of 20.10*/
+ if ((FuncNameString == "atof" || FuncNameString == "atoi" || FuncNameString == "atol") && SM.isInSystemHeader(FD->getLocStart()))
+ {
+ std::cout << "20.10 : " << "Use of atof,atoi and atol is illegal: " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(MR.Context, SL, "20.10", "Use of atof,atoi and atol is illegal: ");
+ }
+ /*end of 20.10*/
+
+ /*start of 20.11*/
+ if ((FuncNameString == "abort" || FuncNameString == "exit" || FuncNameString == "getenv" || FuncNameString == "system") && SM.isInSystemHeader(FD->getLocStart()))
+ {
+ std::cout << "20.11 : " << "Use of abort,exit,getenv and system is illegal : " << std::endl;
+ std::cout << SL.printToString(*MR.SourceManager) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(MR.Context, SL, "20.11", "Use of abort,exit,getenv and system is illegal : ");
+ }
+ /*end of 20.11*/
+
if (CE->getNumArgs() != FD->getNumParams())
{
std::cout << "16.6 : " << "CallExpr number of arguments does not equal the number of parameters in the declaration: " << std::endl;
@@ -669,7 +721,6 @@ public:
VecC = 0U;
};
- /*underdev*/
virtual void run(const MatchFinder::MatchResult &MR)
{
if (MR.Nodes.getNodeAs<clang::FunctionDecl>("mcdcdf81") != nullptr)
@@ -683,6 +734,46 @@ public:
SourceLocation SL = FD->getLocStart();
SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+ SourceLocation SLE = FD->getLocEnd();
+ SLE = Devi::SourceLocationHasMacro(SLE, Rewrite, "start");
+
+ ASTContext* const ASTC = MR.Context;
+ const SourceManager &SM = ASTC->getSourceManager();
+ FullSourceLoc FSL = ASTC->getFullLoc(SL);
+ FullSourceLoc FSLE = ASTC->getFullLoc(SLE);
+
+ /*start of checks for 19.5*/
+ /*has false positives.*/
+ if (FD->isThisDeclarationADefinition())
+ {
+ for (unsigned x = 0; x < MacroDefSourceLocation.size(); ++x)
+ {
+ if (FSL.isBeforeInTranslationUnitThan(MacroDefSourceLocation[x]) && \
+ !FSLE.isBeforeInTranslationUnitThan(MacroDefSourceLocation[x]) && \
+ SM.isInMainFile(MacroDefSourceLocation[x]) && !SM.isInSystemHeader(MacroDefSourceLocation[x]))
+ {
+ std::cout << "19.5 : " << "Macro defined inside a block : " << std::endl;
+ std::cout << MacroDefSourceLocation[x].printToString(*MR.SourceManager) << " " << MacroNameString[x] << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(MR.Context, MacroDefSourceLocation[x], "19.5", "Macro defined inside a block : ");
+ }
+ }
+
+ for (unsigned x = 0; x < MacroUndefSourceLocation.size(); ++x)
+ {
+ if (FSL.isBeforeInTranslationUnitThan(MacroUndefSourceLocation[x]) && \
+ !FSLE.isBeforeInTranslationUnitThan(MacroUndefSourceLocation[x]) && \
+ SM.isInMainFile(MacroUndefSourceLocation[x]) && !SM.isInSystemHeader(MacroUndefSourceLocation[x]))
+ {
+ std::cout << "19.5 : " << "Macro undefined inside a block : " << std::endl;
+ std::cout << MacroUndefSourceLocation[x].printToString(*MR.SourceManager) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(MR.Context, MacroUndefSourceLocation[x], "19.5", "Macro undefined inside a block : ");
+ }
+ }
+ }
+ /*end of checks for 19.5*/
+
/*going through the already matched functions,making sure we are not adding duplicates.*/
for (unsigned x = 0; x < VecC; ++x)
{
@@ -2242,7 +2333,7 @@ private:
/**********************************************************************************************************************/
/**********************************************************************************************************************/
/*the sourcelocation used in the overload of XMLAddNode that takes sourcemanager as input parameter uses
-the speeling location so the client does not need to check the sourcelocation for macros.*/
+the spelling location so the client does not need to check the sourcelocation for macros expansions.*/
class PPInclusion : public PPCallbacks
{
public:
@@ -2267,6 +2358,14 @@ public:
XMLDocOut.XMLAddNode(SM, HashLoc, "19.2", "illegal characters in inclusion directive : ");
}
+ if (FileName == "errno.h")
+ {
+ std::cout << "20.5 : " << "errno shall not be used : " << std::endl;
+ std::cout << HashLoc.printToString(SM) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(SM, HashLoc, "20.5", "errno shall not be used : ");
+ }
+
if (FileName == "time.h")
{
std::cout << "20.12 : " << "stdlib time.h is included in the project. use is forbidden : " << std::endl;
@@ -2319,10 +2418,109 @@ public:
}
+ /*if the macro is not checked for being defined before almost any kind of use, the code will break in seemingly random ways.*/
+ /*FIXME-the macro definition is the definition of the macro passed to defined. not sure what happens if there are more than two.
+ basically i dont know how to just get the tokens after defined.*/
+ virtual void Defined(const Token &MacroNameTok, const MacroDefinition &MD, SourceRange Range)
+ {
+ SourceLocation SL = Range.getBegin();
+
+ const MacroInfo* MI = MD.getMacroInfo();
+
+ DefMacroDirective* DMD = MD.getLocalDirective();
+
+ bool ShouldBeTagged195 = false;
+
+ if (DMD->isDefined())
+ {
+ if (!MI->tokens_empty())
+ {
+ ArrayRef<Token> TokenArrayRef = MI->tokens();
+
+ unsigned NumOfTokens = MI->getNumTokens();
+
+ if (NumOfTokens == 1U)
+ {
+ if (!(TokenArrayRef[0].getKind() == tok::identifier))
+ {
+ ShouldBeTagged195 = true;
+ }
+ }
+ else if (NumOfTokens == 3U)
+ {
+ if (!(TokenArrayRef[0].getKind() == tok::l_paren && TokenArrayRef[1].getKind() == tok::identifier && TokenArrayRef[2].getKind() == tok::r_paren))
+ {
+ //ShouldBeTagged195 = true;
+ }
+ }
+ else
+ {
+ //ShouldBeTagged195 = true;
+ }
+ }
+ else
+ {
+ //ShouldBeTagged195 = true;
+ }
+
+ if (ShouldBeTagged195)
+ {
+#if 0
+ std::cout << "19.14 : " << "Illegal \"defined\" form : " << std::endl;
+ std::cout << SL.printToString(SM) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(SM, SL, "19.14", "Illegal \"defined\" form : ");
+#endif
+ }
+ }
+
+ }
+
virtual void MacroUndefined(const Token &MacroNameTok, const MacroDefinition &MD)
{
+ const MacroInfo* MI = MD.getMacroInfo();
+
+ DefMacroDirective* DMD = MD.getLocalDirective();
+
SourceLocation SL = MacroNameTok.getLocation();
+ /*start of 20.1*/
+ /*inline and restrict are C99*/
+ if (MacroNameTok.isOneOf(tok::kw_auto, tok::kw_break, tok::kw_case, tok::kw_char, tok::kw_const, tok::kw_continue, \
+ tok::kw_default, tok::kw_do, tok::kw_double, tok::kw_else, tok::kw_enum, tok::kw_extern, \
+ tok::kw_float, tok::kw_for, tok::kw_goto, tok::kw_if, tok::kw_inline, tok::kw_int, tok::kw_long, \
+ tok::kw_register, tok::kw_restrict, tok::kw_return, tok::kw_short, tok::kw_signed, tok::kw_sizeof, \
+ tok::kw_static, tok::kw_struct, tok::kw_switch, \
+ tok::kw_typedef, tok::kw_union, tok::kw_unsigned, tok::kw_void, tok::kw_volatile, tok::kw_while))
+ {
+ std::cout << "20.1 : " << "C keyword undefined : " << std::endl;
+ std::cout << SL.printToString(SM) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(SM, SL, "20.1", "C keyword undefined : ");
+ }
+
+ if (DMD->getPrevious() != nullptr)
+ {
+ const MacroDirective* PMD = DMD->getPrevious();
+ SourceLocation PSL = PMD->getLocation();
+
+ if (SM.isInSystemHeader(PSL) || MI->isBuiltinMacro())
+ {
+ std::cout << "20.1 : " << "C standard library macro undefined : " << std::endl;
+ std::cout << SL.printToString(SM) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(SM, SL, "20.1", "C standard library macro undefined : ");
+ }
+ }
+ /*end of 20.1*/
+
+ /*start of 19.5*/
+ if (!MI->isBuiltinMacro() && SM.isInMainFile(SL) && !SM.isInSystemHeader(SL))
+ {
+ MacroUndefSourceLocation.push_back(SL);
+ }
+ /*end of 19.5*/
+
std::cout << "19.6 : " << "Use of #undef is illegal : " << std::endl;
std::cout << SL.printToString(SM) << "\n" << std::endl;
@@ -2336,6 +2534,44 @@ public:
SourceLocation SL = MacroNameTok.getLocation();
unsigned MacroNumArgs = MI->getNumArgs();
+ /*start of 19.5*/
+ if (!MI->isBuiltinMacro() && SM.isInMainFile(SL) && !SM.isInSystemHeader(SL))
+ {
+ MacroDefSourceLocation.push_back(SM.getExpansionLoc(SL));
+ MacroNameString.push_back(MacroNameTok.getIdentifierInfo()->getName().str());
+ }
+ /*end of 19.5*/
+
+ /*start of 20.1*/
+ /*inline and restrict are C99*/
+ if (MacroNameTok.isOneOf(tok::kw_auto, tok::kw_break, tok::kw_case, tok::kw_char, tok::kw_const, tok::kw_continue, \
+ tok::kw_default, tok::kw_do, tok::kw_double, tok::kw_else, tok::kw_enum, tok::kw_extern, \
+ tok::kw_float, tok::kw_for, tok::kw_goto, tok::kw_if, tok::kw_inline, tok::kw_int, tok::kw_long, \
+ tok::kw_register, tok::kw_restrict, tok::kw_return, tok::kw_short, tok::kw_signed, tok::kw_sizeof, \
+ tok::kw_static, tok::kw_struct, tok::kw_switch, \
+ tok::kw_typedef, tok::kw_union, tok::kw_unsigned, tok::kw_void, tok::kw_volatile, tok::kw_while))
+ {
+ std::cout << "20.1 : " << "C keyword defined : " << std::endl;
+ std::cout << SL.printToString(SM) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(SM, SL, "20.1", "C keyword defined : ");
+ }
+
+ if (MD->getPrevious() != nullptr)
+ {
+ const MacroDirective* PMD = MD->getPrevious();
+ SourceLocation PSL = PMD->getLocation();
+
+ if (SM.isInSystemHeader(PSL) || MI->isBuiltinMacro())
+ {
+ std::cout << "20.1 : " << "C standard library macro redefined : " << std::endl;
+ std::cout << SL.printToString(SM) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(SM, SL, "20.1", "C standard library macro redefined : ");
+ }
+ }
+ /*end of 20.1*/
+
ArrayRef<Token> TokenArrayRef = MI->tokens();
ArrayRef<const IdentifierInfo*> MacroArgsArrRef = MI->args();
@@ -2468,8 +2704,28 @@ public:
{
SourceLocation SL = MacroNameTok.getLocation();
+ IdentifierInfo* II = MacroNameTok.getIdentifierInfo();
+
+ std::string MacroNameString = II->getName().str();
+
DefMacroDirective* DMD = MD.getLocalDirective();
+ if (MacroNameString == "offsetof" && SM.isInSystemHeader(DMD->getLocation()))
+ {
+ std::cout << "20.6 : " << "use of offsetof is illegal : " << std::endl;
+ std::cout << Range.getBegin().printToString(SM) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(SM, SL, "20.6", "use of offsetof is illegal : ");
+ }
+
+ if (MacroNameString == "setjmp" && SM.isInSystemHeader(DMD->getLocation()))
+ {
+ std::cout << "20.7 : " << "use of setjmp is illegal : " << std::endl;
+ std::cout << Range.getBegin().printToString(SM) << "\n" << std::endl;
+
+ XMLDocOut.XMLAddNode(SM, SL, "20.7", "use of setjmp is illegal : ");
+ }
+
if (!DMD->isDefined())
{
std::cout << "19.11 : " << "Use of undefined macro : " << std::endl;