aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mutator-lvl0.cpp148
1 files changed, 140 insertions, 8 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp
index a051e7e..4ace253 100644
--- a/mutator-lvl0.cpp
+++ b/mutator-lvl0.cpp
@@ -22,6 +22,7 @@
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Basic/OperatorKinds.h"
#include "clang/Basic/SourceManager.h"
+#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/FrontendActions.h"
@@ -29,6 +30,7 @@
#include "clang/Lex/Preprocessor.h"
#include "clang/Lex/PPCallbacks.h"
#include "clang/Tooling/CommonOptionsParser.h"
+#include "clang/Tooling/Core/QualTypeNames.h"
#include "clang/Tooling/Tooling.h"
#include "clang/Rewrite/Core/Rewriter.h"
/*LLVM headers*/
@@ -4579,11 +4581,7 @@ public:
return void();
}
- if (Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL))
- {
- /*intentionally left blank*/
- }
- else
+ if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL))
{
return void();
}
@@ -4691,7 +4689,7 @@ public:
if ((MatchedDous && (DousFinal != IntExprValue)) || (MatchedUno && (UnoFinal != IntExprValue)))
{
- std::cout << "12.11" << ":" << "Constant Unsinged Expr evaluation resuslts in an overflow:" << ":" << SL.printToString(*MR.SourceManager) << ":" << IntExprValue << " " << DousFinal << " " << ":" << targetExpr << std::endl;
+ std::cout << "12.11" << ":" << "Constant Unsinged Expr evaluation resuslts in an overflow:" << SL.printToString(*MR.SourceManager) << ":" << IntExprValue << " " << DousFinal << " " << ":" << targetExpr << std::endl;
XMLDocOut.XMLAddNode(MR.Context, SL, "12.11", "Constant Unsinged Expr evaluation resuslts in an overflow:");
JSONDocOUT.JSONAddElement(MR.Context, SL, "12.11", "Constant Unsinged Expr evaluation resuslts in an overflow:");
@@ -4704,6 +4702,133 @@ private:
Rewriter &Rewrite;
};
/**********************************************************************************************************************/
+class MCATC105 : public MatchFinder::MatchCallback
+{
+public:
+ MCATC105 (Rewriter &Rewrite) : Rewrite(Rewrite) {}
+
+ virtual void run(const MatchFinder::MatchResult &MR)
+ {
+ if (MR.Nodes.getNodeAs<clang::Expr>("mcatc105lhs") != nullptr)
+ {
+ bool ShouldBeTagged = false;
+ SourceLocation SL;
+ const Expr* IgnoreImplicitEXP;
+ ast_type_traits::DynTypedNode DynOpNode;
+
+ if (MR.Nodes.getNodeAs<clang::BinaryOperator>("mcatc105") != nullptr)
+ {
+ const BinaryOperator* BO = MR.Nodes.getNodeAs<clang::BinaryOperator>("mcatc105");
+ const Expr* EXP = MR.Nodes.getNodeAs<clang::Expr>("mcatc105lhs");
+ IgnoreImplicitEXP = EXP->IgnoreImpCasts();
+ DynOpNode = ast_type_traits::DynTypedNode::create<clang::BinaryOperator>(*BO);
+
+ SL = BO->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+ }
+
+ if (MR.Nodes.getNodeAs<clang::UnaryOperator>("mcatc105uno") != nullptr)
+ {
+ const UnaryOperator* UO = MR.Nodes.getNodeAs<clang::UnaryOperator>("mcatc105uno");
+ const Expr* EXP = MR.Nodes.getNodeAs<clang::Expr>("mcatc105lhs");
+ IgnoreImplicitEXP = EXP->IgnoreImpCasts();
+ DynOpNode = ast_type_traits::DynTypedNode::create<clang::UnaryOperator>(*UO);
+
+ SL = UO->getLocStart();
+ SL = Devi::SourceLocationHasMacro(SL, Rewrite, "start");
+ }
+
+ if (Devi::IsTheMatchInSysHeader(CheckSystemHeader, MR, SL))
+ {
+ return void();
+ }
+
+ if (!Devi::IsTheMatchInMainFile(MainFileOnly, MR, SL))
+ {
+ return void();
+ }
+
+ ASTContext *const ASTC = MR.Context;
+
+ const TargetInfo &TI = ASTC->getTargetInfo();
+
+ unsigned int ShortSize = TI.getShortWidth();
+
+ QualType QT = IgnoreImplicitEXP->getType();
+ const clang::Type* TP = QT.getTypePtr();
+
+ const clang::Type* CanonTP = ASTC->getCanonicalType(TP);
+
+ if (CanonTP->isUnsignedIntegerType() || CanonTP->isSignedIntegerType() || CanonTP->isAnyCharacterType())
+ {
+
+ /*@DEVI-assumptions:nothing has more than one parent in C.*/
+ if (ShortSize == ASTC->getTypeSize(QT) || 8U == ASTC->getTypeSize(QT))
+ {
+ ASTContext::DynTypedNodeList NodeList = ASTC->getParents(DynOpNode);
+
+ const ast_type_traits::DynTypedNode &ParentNode = NodeList[0U];
+
+ ASTContext::DynTypedNodeList AncestorNodeList = ASTC->getParents(ParentNode);
+
+ const ast_type_traits::DynTypedNode AncestorNode = AncestorNodeList[0U];
+
+ ast_type_traits::ASTNodeKind ParentNodeKind = ParentNode.getNodeKind();
+ ast_type_traits::ASTNodeKind AncestorNodeKind = AncestorNode.getNodeKind();
+
+ std::string ParentStringKind = ParentNodeKind.asStringRef().str();
+ std::string AncestorStringKind = AncestorNodeKind.asStringRef().str();
+
+ if (ParentStringKind == "CStyleCastExpr")
+ {
+ const CStyleCastExpr* CSCE = ParentNode.get<clang::CStyleCastExpr>();
+
+ if (CSCE->getType() != QT)
+ {
+ ShouldBeTagged = true;
+ }
+ }
+ else if (ParentStringKind == "ParenExpr" && AncestorStringKind == "CStyleCastExpr")
+ {
+ const CStyleCastExpr* CSCE = AncestorNode.get<clang::CStyleCastExpr>();
+
+ if (CSCE->getType() != QT)
+ {
+ ShouldBeTagged = true;
+ }
+ }
+ else
+ {
+ ShouldBeTagged = true;
+ }
+
+ if (ShouldBeTagged)
+ {
+ std::cout << "10.5" << ":" << "Result of operands << or ~ must be explicitly cast to the type of the expression:" << SL.printToString(*MR.SourceManager) << ":" << std::endl;
+
+ XMLDocOut.XMLAddNode(MR.Context, SL, "10.5", "Result of operands << or ~ must be explicitly cast to the type of the expression:");
+ JSONDocOUT.JSONAddElement(MR.Context, SL, "10.5", "Result of operands << or ~ must be explicitly cast to the type of the expression:");
+ }
+ }
+ }
+
+#if 0
+ const BuiltinType* BT = CanonTP->getAsPlaceholderType();
+ const LangOptions &LO = ASTC->getLangOpts();
+ std::string something = TypeName::getFullyQualifiedName(QT, *ASTC, true);
+ StringRef BTName = BT->getName(PrintingPolicy(LO));
+#endif
+ }
+ }
+
+private:
+ Rewriter &Rewrite;
+};
+/**********************************************************************************************************************/
+/**********************************************************************************************************************/
+/**********************************************************************************************************************/
+/**********************************************************************************************************************/
+/**********************************************************************************************************************/
/**********************************************************************************************************************/
/**********************************************************************************************************************/
/**********************************************************************************************************************/
@@ -5947,7 +6072,7 @@ public:
HandlerForCSE137(R), HandlerForDCDF810(R), HandlerForFunction165(R), HandlerForFunction1652(R), HandlerForPointer171(R), \
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) {
+ HandlerForFunction167(R), HandlerForCF143(R), HandlerForExpr1212(R), HandlerForExpr1211(R), HandlerForAtc105(R) {
#if 1
/*forstmts whithout a compound statement.*/
@@ -6149,7 +6274,13 @@ public:
Matcher.addMatcher(recordDecl(allOf(has(fieldDecl(hasType(realFloatingPointType()))), isUnion())).bind("mcexpr1212"), &HandlerForExpr1212);
- Matcher.addMatcher(expr(hasDescendant(expr(anyOf(unaryOperator(hasOperatorName("--"), hasOperatorName("++")).bind("mcexpr1211uno"), binaryOperator(anyOf(hasOperatorName("*"), hasOperatorName("/"), hasOperatorName("-"), hasOperatorName("+"))).bind("mcexpr1211dous"))))).bind("mcexpr1211"), &HandlerForExpr1211);
+ Matcher.addMatcher(expr(hasDescendant(expr(anyOf(unaryOperator(hasOperatorName("--"), hasOperatorName("++")).bind("mcexpr1211uno"), \
+ binaryOperator(anyOf(hasOperatorName("*"), hasOperatorName("/"), \
+ hasOperatorName("-"), hasOperatorName("+"))).bind("mcexpr1211dous"))))).bind("mcexpr1211"), &HandlerForExpr1211);
+
+ Matcher.addMatcher(binaryOperator(allOf(hasLHS(expr(hasType(isInteger())).bind("mcatc105lhs")), hasOperatorName("<<"))).bind("mcatc105"), &HandlerForAtc105);
+
+ Matcher.addMatcher(unaryOperator(allOf(hasOperatorName("~") , hasUnaryOperand(expr(hasType(isInteger())).bind("mcatc105lhs")))).bind("mcatc105uno"), &HandlerForAtc105);
#endif
}
@@ -6224,6 +6355,7 @@ private:
MCCF143 HandlerForCF143;
MCExpr1212 HandlerForExpr1212;
MCExpr1211 HandlerForExpr1211;
+ MCATC105 HandlerForAtc105;
MatchFinder Matcher;
};
/**********************************************************************************************************************/