diff options
Diffstat (limited to '')
-rw-r--r-- | mutator-lvl0.cpp | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp index fdded89..2be95af 100644 --- a/mutator-lvl0.cpp +++ b/mutator-lvl0.cpp @@ -5096,6 +5096,181 @@ public: DefMacroDirective* DMD = MD.getLocalDirective(); + SourceLocation MDSL = DMD->getLocation(); + + MacroInfo* MI = MD.getMacroInfo(); + + /*underdev2*/ + /*start of 19.4*/ + ArrayRef<Token> TokenArrayRef = MI->tokens(); + + /*@DEVI-guard against macro defs that just define the macro without a value.*/ + if (TokenArrayRef.size() != 0U) + { + bool MacroExpansionIsTypeQualifier = true; + bool MacroExpansionIsStorageSpecifier = true; + bool MacroExpansionStringLiteral = false; + bool MacroExpansionConstant = false; + bool MacroExpansionBracedInitializer = true; + bool MacroExpansionParenExpr = true; + bool MacroExpansionDoWhileZero = true; + + if (TokenArrayRef.front().getKind() == tok::l_paren && TokenArrayRef.back().getKind() == tok::r_paren) + { + /*currently we do not care what's inside the parens.*/ + } + else + { + MacroExpansionParenExpr = false; + } + + if (TokenArrayRef.front().getKind() == tok::l_brace && TokenArrayRef.back().getKind() == tok::r_brace) + { + /*currently we don't care what's inside the curly braces.*/ + } + else + { + MacroExpansionBracedInitializer = false; + } + + //std::vector<tok::TokenKind> TokenPattern = {tok::kw_while, tok::l_paren, tok::numeric_constant, tok::r_paren}; + std::vector<tok::TokenKind> TokenPattern; + TokenPattern.push_back(tok::kw_while); + TokenPattern.push_back(tok::l_paren); + TokenPattern.push_back(tok::numeric_constant); + TokenPattern.push_back(tok::r_paren); + + if (TokenArrayRef.front().getKind() == tok::kw_do) + { + unsigned marker = 0U; + + for (ArrayRef<Token>::iterator iter = TokenArrayRef.begin(); iter != TokenArrayRef.end(); ++iter) + { + if (iter->getKind() == tok::kw_while) + { + marker = 0U; + } + + if (marker == 3U && iter->getKind() == TokenPattern[3]) + { + marker = 4U; + } + else if (marker == 3U && iter->getKind() != TokenPattern[3]) + { + marker = 0U; + } + else + { + /*empty*/ + } + + if (marker == 2U && iter->getKind() == TokenPattern[2]) + { + marker = 3U; + } + else if (marker == 2U && iter->getKind() != TokenPattern[2]) + { + marker = 0U; + } + else + { + /*empty*/ + } + + if (marker == 1U && iter->getKind() == TokenPattern[1]) + { + marker = 2U; + } + else if (marker == 1U && iter->getKind() != TokenPattern[1]) + { + + } + else + { + /*empty*/ + } + + if (marker == 0U && iter->getKind() == TokenPattern[0]) + { + marker = 1U; + } + } + + if (marker != 4U) + { + MacroExpansionDoWhileZero = false; + } + } + else + { + MacroExpansionDoWhileZero = false; + } + + if (TokenArrayRef.size() == 1U) + { + if (TokenArrayRef[0].getKind() == tok::string_literal || TokenArrayRef[0].getKind() == tok::wide_string_literal \ + || TokenArrayRef[0].getKind() == tok::utf8_string_literal || TokenArrayRef[0].getKind() == tok::utf16_string_literal \ + || TokenArrayRef[0].getKind() == tok::utf32_string_literal) + { + MacroExpansionStringLiteral = true; + } + + if (TokenArrayRef[0].getKind() == tok::numeric_constant || TokenArrayRef[0].getKind() == tok::char_constant \ + || TokenArrayRef[0].getKind() == tok::wide_char_constant || TokenArrayRef[0].getKind() == tok::utf8_char_constant \ + || TokenArrayRef[0].getKind() == tok::utf16_char_constant || TokenArrayRef[0].getKind() == tok::utf32_char_constant) + { + MacroExpansionConstant = true; + } + } + + for (auto &iter : TokenArrayRef) + { + if (iter.getKind() == tok::kw_const || iter.getKind() == tok::kw_restrict || iter.getKind() == tok::kw_volatile \ + || iter.getKind() == tok::l_paren || iter.getKind() == tok::r_paren) + { + /*has no significance*/ + } + else + { + MacroExpansionIsTypeQualifier = false; + } + + if (iter.getKind() == tok::kw_auto || iter.getKind() == tok::kw_extern || iter.getKind() == tok::kw_register \ + || iter.getKind() == tok::kw_static || iter.getKind() == tok::kw_typedef \ + || iter.getKind() == tok::l_paren || iter.getKind() == tok::r_paren) + { + /*has no significance*/ + } + else + { + MacroExpansionIsStorageSpecifier = false; + } + } + + if (!MacroExpansionIsTypeQualifier && !MacroExpansionIsStorageSpecifier \ + && !MacroExpansionStringLiteral && !MacroExpansionConstant \ + && !MacroExpansionBracedInitializer && !MacroExpansionParenExpr \ + && !MacroExpansionDoWhileZero) + { + if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, SM, MDSL)) + { + /*intentionally left blank*/ + } + else + { + if (Devi::IsTheMatchInMainFile(MainFileOnly, SM, MDSL)) + { + std::cout << "19.4:" << "Macro does not expand to braced initializer,panthesizes expression,string literal,constant,do-while-zero,storage class specifier or type qualifier:"; + std::cout << Range.getBegin().printToString(SM) << ":" << std::endl; + + XMLDocOut.XMLAddNode(SM, SL, "19.4", "Macro does not expand to braced initializer,panthesizes expression,string literal,constant,do-while-zero,storage class specifier or type qualifier : "); + JSONDocOUT.JSONAddElement(SM, SL, "19.4", "Macro does not expand to braced initializer,panthesizes expression,string literal,constant,do-while-zero,storage class specifier or type qualifier : "); + } + } + } + } + /*end of 19.4*/ + if (MacroNameString == "offsetof" && SM.isInSystemHeader(DMD->getLocation())) { if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, SM, SL)) @@ -5142,6 +5317,7 @@ public: } else { + /*@DEVI-by the time we get a callback on our callback, the macri is assigned a default vlaue even if it is undefined in the TU.*/ if (Devi::IsTheMatchInMainFile(MainFileOnly, SM, SL)) { std::cout << "19.11:" << "Use of undefined macro:"; |