aboutsummaryrefslogtreecommitdiffstats
path: root/mutator_report.cpp
diff options
context:
space:
mode:
authorbloodstalker <thabogre@gmail.com>2017-03-16 21:49:18 +0000
committerbloodstalker <thabogre@gmail.com>2017-03-16 21:49:18 +0000
commitc6d6b2896b61524c89b582574e5d65561acdf064 (patch)
tree7e9852b28f156ef4ff9cb5d0e1376cc8c0257b86 /mutator_report.cpp
parentthe header (diff)
downloadmutator-c6d6b2896b61524c89b582574e5d65561acdf064.tar.gz
mutator-c6d6b2896b61524c89b582574e5d65561acdf064.zip
the XML and JSON report classes are here now
Diffstat (limited to 'mutator_report.cpp')
-rw-r--r--mutator_report.cpp266
1 files changed, 266 insertions, 0 deletions
diff --git a/mutator_report.cpp b/mutator_report.cpp
new file mode 100644
index 0000000..94ddd6b
--- /dev/null
+++ b/mutator_report.cpp
@@ -0,0 +1,266 @@
+
+/***************************************************Project Mutator****************************************************/
+//-*-c++-*-
+/*first line intentionally left blank.*/
+/*Copyright (C) 2017 Farzad Sadeghi
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.*/
+/*********************************************************************************************************************/
+/*inclusion directives*/
+#include "mutator_report.h"
+#include <string>
+#include <cassert>
+#include <iostream>
+#include <fstream>
+#include "clang/AST/AST.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Rewrite/Core/Rewriter.h"
+#include "tinyxml2/tinyxml2.h"
+#include "json/json.hpp"
+/*********************************************************************************************************************/
+using namespace clang;
+using namespace tinyxml2;
+using json = nlohmann::json;
+/*********************************************************************************************************************/
+namespace Devi {
+/*********************************************************************************************************************/
+/*********************************************************************************************************************/
+/******************************************************XMLReport******************************************************/
+XMLReport::XMLReport()
+{
+ RootPointer = XMLReportDoc.NewElement("mutator:Report");
+#if 1
+ RootPointer->SetAttribute("xmlns:mutator", "http://www.w3.org/2001/XMLSchema");
+#endif
+}
+
+void XMLReport::XMLCreateReport()
+{
+ XMLReportDoc.InsertFirstChild(RootPointer);
+}
+
+/*it is the caller's responsibility to make sure the sourcelocation passed to this overload of the member function
+contains only the spelling location.*/
+void XMLReport::XMLAddNode(ASTContext* ASTC, SourceLocation SL, std::string MisraRule, std::string Description)
+{
+ //assert(SL.isValid() && "SourceLocation passed as function parameter in an overload(1) of XMLAddNode is not valid.");
+
+ FullSourceLoc FSL = ASTC->getFullLoc(SL);
+
+ unsigned LineNumber = FSL.getSpellingLineNumber();
+ unsigned ColumnNumber = FSL.getSpellingColumnNumber();
+
+ const SourceManager& SM = FSL.getManager();
+ std::string FileNameString = SM.getFilename(SL).str();
+
+ XMLElement* MisraElement = XMLReportDoc.NewElement("MisraDiag");
+ MisraElement->SetText(Description.c_str());
+ MisraElement->SetAttribute("Misra-C-2004Rule", MisraRule.c_str());
+ MisraElement->SetAttribute("FileName", FileNameString.c_str());
+ MisraElement->SetAttribute("SpellingLineNumber", LineNumber);
+ MisraElement->SetAttribute("SpellingColumnNumber", ColumnNumber);
+ RootPointer->InsertEndChild(MisraElement);
+}
+
+void XMLReport::XMLAddNode(FullSourceLoc FullSrcLoc, SourceLocation SL, std::string MisraRule, std::string Description)
+{
+ //assert(SL.isValid() && "SourceLocation passed as function parameter in an overload(2) of XMLAddNode is not valid.");
+
+ unsigned LineNumber = FullSrcLoc.getSpellingLineNumber();
+ unsigned ColumnNumber = FullSrcLoc.getSpellingColumnNumber();
+
+ const SourceManager& SM = FullSrcLoc.getManager();
+ std::string FileNameString = SM.getFilename(SL).str();
+
+ XMLElement* MisraElement = XMLReportDoc.NewElement("MisraDiag");
+ MisraElement->SetText(Description.c_str());
+ MisraElement->SetAttribute("Misra-C-2004Rule", MisraRule.c_str());
+ MisraElement->SetAttribute("FileName", FileNameString.c_str());
+ MisraElement->SetAttribute("SpellingLineNumber", LineNumber);
+ MisraElement->SetAttribute("SpellingColumnNumber", ColumnNumber);
+ RootPointer->InsertEndChild(MisraElement);
+}
+
+void XMLReport::XMLAddNode(const SourceManager &SM, SourceLocation SL, std::string MisraRule, std::string Description)
+{
+ SL = SM.getSpellingLoc(SL);
+
+ //assert(SL.isValid() && "SourceLocation Acquired by SourceManager in an overload(3) of XMLAddNode is not valid.");
+
+ unsigned LineNumber = SM.getSpellingLineNumber(SL);
+ unsigned ColumnNumber = SM.getSpellingColumnNumber(SL);
+
+ std::string FileNameString = SM.getFilename(SL).str();
+
+ XMLElement* MisraElement = XMLReportDoc.NewElement("MisraDiag");
+ MisraElement->SetText(Description.c_str());
+ MisraElement->SetAttribute("Misra-C-2004Rule", MisraRule.c_str());
+ MisraElement->SetAttribute("FileName", FileNameString.c_str());
+ MisraElement->SetAttribute("SpellingLineNumber", LineNumber);
+ MisraElement->SetAttribute("SpellingColumnNumber", ColumnNumber);
+ RootPointer->InsertEndChild(MisraElement);
+}
+
+void XMLReport::XMLAddNode(std::string FilePath, std::string MisraRule, std::string Description)
+{
+ //assert(SL.isValid() && "SourceLocation Acquired by SourceManager in an overload(3) of XMLAddNode is not valid.");
+
+ XMLElement* MisraElement = XMLReportDoc.NewElement("MisraDiag");
+ MisraElement->SetText(Description.c_str());
+ MisraElement->SetAttribute("Misra-C-2004Rule", MisraRule.c_str());
+ MisraElement->SetAttribute("FileName", FilePath.c_str());
+ RootPointer->InsertEndChild(MisraElement);
+}
+
+void XMLReport::XMLAddNode(unsigned Line, unsigned Column, std::string FileName, std::string MisraRule, std::string Description)
+{
+ //assert(SL.isValid() && "SourceLocation Acquired by SourceManager in an overload(3) of XMLAddNode is not valid.");
+
+ XMLElement* MisraElement = XMLReportDoc.NewElement("MisraDiag");
+ MisraElement->SetText(Description.c_str());
+ MisraElement->SetAttribute("Misra-C-2004Rule", MisraRule.c_str());
+ MisraElement->SetAttribute("FileName", FileName.c_str());
+ MisraElement->SetAttribute("SpellingLineNumber", Line);
+ MisraElement->SetAttribute("SpellingColumnNumber", Column);
+ RootPointer->InsertEndChild(MisraElement);
+}
+
+void XMLReport::SaveReport(void)
+{
+ XMLError XMLErrorResult = XMLReportDoc.SaveFile("./test/misrareport.xml");
+
+ if (XMLErrorResult != XML_SUCCESS)
+ {
+ std::cout << "could not write xml misra report." << std::endl;
+ }
+}
+/***************************************************End of XMLReport**************************************************/
+/*********************************************************************************************************************/
+/*****************************************************JSONReport******************************************************/
+JSONReport::JSONReport() {}
+
+void JSONReport::JSONCreateReport(void)
+{
+ JSONRepFile.open("./test/misrareport.json", std::ios::out);
+}
+
+void JSONReport::JSONAddElement(ASTContext* ASTC, SourceLocation SL, std::string MisraRule, std::string Description)
+{
+ //assert(SL.isValid() && "SourceLocation passed as function parameter in an overload(1) of JSONAddElement is not valid.");
+
+ FullSourceLoc FSL = ASTC->getFullLoc(SL);
+
+ unsigned LineNumber = FSL.getSpellingLineNumber();
+ unsigned ColumnNumber = FSL.getSpellingColumnNumber();
+
+ const SourceManager& SM = FSL.getManager();
+ std::string FileNameString = SM.getFilename(SL).str();
+
+ json RepJ;
+
+ RepJ["MisraDiag"]["Description"] = Description.c_str();
+ RepJ["MisraDiag"]["Misra-C-2004Rule"] = MisraRule.c_str();
+ RepJ["MisraDiag"]["FileName"] = FileNameString.c_str();
+ RepJ["MisraDiag"]["SpellingLineNumber"] = LineNumber;
+ RepJ["MisraDiag"]["SpellingColumnNumber"] = ColumnNumber;
+
+ JSONRepFile << RepJ << std::endl;
+}
+
+void JSONReport::JSONAddElement(FullSourceLoc FullSrcLoc, SourceLocation SL, std::string MisraRule, std::string Description)
+{
+ //assert(SL.isValid() && "SourceLocation passed as function parameter in an overload(2) of XMLAddNode is not valid.");
+
+ unsigned LineNumber = FullSrcLoc.getSpellingLineNumber();
+ unsigned ColumnNumber = FullSrcLoc.getSpellingColumnNumber();
+
+ const SourceManager& SM = FullSrcLoc.getManager();
+ std::string FileNameString = SM.getFilename(SL).str();
+
+ json RepJ;
+
+ RepJ["MisraDiag"]["Description"] = Description.c_str();
+ RepJ["MisraDiag"]["Misra-C-2004Rule"] = MisraRule.c_str();
+ RepJ["MisraDiag"]["FileName"] = FileNameString.c_str();
+ RepJ["MisraDiag"]["SpellingLineNumber"] = LineNumber;
+ RepJ["MisraDiag"]["SpellingColumnNumber"] = ColumnNumber;
+
+ JSONRepFile << RepJ << std::endl;
+}
+
+void JSONReport::JSONAddElement(const SourceManager &SM, SourceLocation SL, std::string MisraRule, std::string Description)
+{
+ SL = SM.getSpellingLoc(SL);
+
+ //assert(SL.isValid() && "SourceLocation Acquired by SourceManager in an overload(3) of XMLAddNode is not valid.");
+
+ unsigned LineNumber = SM.getSpellingLineNumber(SL);
+ unsigned ColumnNumber = SM.getSpellingColumnNumber(SL);
+
+ std::string FileNameString = SM.getFilename(SL).str();
+
+ json RepJ;
+
+ RepJ["MisraDiag"]["Description"] = Description.c_str();
+ RepJ["MisraDiag"]["Misra-C-2004Rule"] = MisraRule.c_str();
+ RepJ["MisraDiag"]["FileName"] = FileNameString.c_str();
+ RepJ["MisraDiag"]["SpellingLineNumber"] = LineNumber;
+ RepJ["MisraDiag"]["SpellingColumnNumber"] = ColumnNumber;
+
+ JSONRepFile << RepJ << std::endl;
+}
+
+void JSONReport::JSONAddElement(std::string FilePath, std::string MisraRule, std::string Description)
+{
+ //assert(SL.isValid() && "SourceLocation Acquired by SourceManager in an overload(3) of XMLAddNode is not valid.");
+
+ json RepJ;
+
+ RepJ["MisraDiag"]["Description"] = Description.c_str();
+ RepJ["MisraDiag"]["Misra-C-2004Rule"] = MisraRule.c_str();
+ RepJ["MisraDiag"]["FileName"] = FilePath.c_str();
+
+
+ JSONRepFile << RepJ << std::endl;
+}
+
+void JSONReport::JSONAddElement(unsigned Line, unsigned Column, std::string FileName, std::string MisraRule, std::string Description)
+{
+ //assert(SL.isValid() && "SourceLocation Acquired by SourceManager in an overload(3) of XMLAddNode is not valid.");
+
+ json RepJ;
+
+ RepJ["MisraDiag"]["Description"] = Description.c_str();
+ RepJ["MisraDiag"]["Misra-C-2004Rule"] = MisraRule.c_str();
+ RepJ["MisraDiag"]["FileName"] = FileName.c_str();
+ RepJ["MisraDiag"]["SpellingLineNumber"] = Line;
+ RepJ["MisraDiag"]["SpellingColumnNumber"] = Column;
+
+ JSONRepFile << RepJ << std::endl;
+}
+
+void JSONReport::CloseReport(void)
+{
+ JSONRepFile.close();
+}
+/*********************************************************************************************************************/
+/****************************************************End Of JSONReport************************************************/
+/*********************************************************************************************************************/
+/*End of namespace Devi*/
+}
+/*********************************************************************************************************************/
+/*last line intentionally left blank.*/
+