aboutsummaryrefslogtreecommitdiffstats
path: root/mutator-lvl0.cpp
diff options
context:
space:
mode:
authorbloodstalker <thabogre@gmail.com>2017-02-22 14:09:21 +0000
committerbloodstalker <thabogre@gmail.com>2017-02-22 14:09:21 +0000
commit6227f6de95c04d9017985650547df772383f30bc (patch)
tree45e3668ca1037c7c76baf512f8b0518ee1faeb84 /mutator-lvl0.cpp
parenttrying to fix the coverage build crash issue (diff)
downloadmutator-6227f6de95c04d9017985650547df772383f30bc.tar.gz
mutator-6227f6de95c04d9017985650547df772383f30bc.zip
added the functionality to handle Misrac98 and MisraC2012 plus the rule check disabling features
Diffstat (limited to 'mutator-lvl0.cpp')
-rw-r--r--mutator-lvl0.cpp114
1 files changed, 101 insertions, 13 deletions
diff --git a/mutator-lvl0.cpp b/mutator-lvl0.cpp
index dfb5aa0..9bb56fb 100644
--- a/mutator-lvl0.cpp
+++ b/mutator-lvl0.cpp
@@ -194,7 +194,7 @@ std::vector<IdentInfo> IdentInfoProto;
/*mutator-lvl0 executable options*/
enum MisraC
{
- MisraC2004, MisraC2012, C2, C3
+ NA=0x0, MisraC98=(0x3<<0), MisraC2004=(0x3<<2), MisraC2012=(0x3<<4), C1=(0x1<<1), C2=(0x1<<3), C3=(0x1<<5)
};
static llvm::cl::OptionCategory MutatorLVL0Cat("mutator-lvl0 options category");
@@ -203,9 +203,9 @@ cl::opt<bool> CheckSystemHeader("SysHeader", cl::desc("mutator-lvl0 will run thr
cl::opt<bool> MainFileOnly("MainOnly", cl::desc("mutator-lvl0 will only report the results that reside in the main file"), cl::init(false), cl::cat(MutatorLVL0Cat), cl::ZeroOrMore);
cl::opt<MisraC> MisraCVersion(cl::desc("choose the MisraC version to check against"), \
cl::values(clEnumVal(MisraC2004, "Misra-C:2004"), clEnumVal(MisraC2012, "Misra-C:2012"), \
- clEnumVal(C2, "Misra-C:2004"), clEnumVal(C3, "Misra-C:2012")), cl::init(MisraC2004));
-cl::opt<std::string> MCE("MCE", cl::desc("MisraC switches to enable specific rule checks"), cl::init(""), cl::cat(MutatorLVL0Cat), cl::Optional);
-cl::opt<std::string> MCD("MCD", cl::desc("MisraC switches to disable specific rule checks"), cl::init(""), cl::cat(MutatorLVL0Cat), cl::Optional);
+ clEnumVal(C2, "Misra-C:2004"), clEnumVal(C3, "Misra-C:2012")), cl::init(MisraC2004), cl::cat(MutatorLVL0Cat), cl::Optional);
+cl::opt<std::string> MCE("MCE", cl::desc("MisraC switches to enable specific rule checks"), cl::init(" "), cl::cat(MutatorLVL0Cat), cl::Optional);
+cl::opt<std::string> MCD("MCD", cl::desc("MisraC switches to disable specific rule checks"), cl::init(" "), cl::cat(MutatorLVL0Cat), cl::Optional);
cl::opt<bool> MCEA("MCEA", cl::desc("MisraC switch to enable all rule checks"), cl::init(true), cl::cat(MutatorLVL0Cat), cl::Optional);
cl::opt<bool> MCDA("MCDA", cl::desc("MisraC switches to disable all rule checks"), cl::init(false), cl::cat(MutatorLVL0Cat), cl::Optional);
/**********************************************************************************************************************/
@@ -216,24 +216,103 @@ public:
bool MC2Parser(void)
{
- if (MCEA && MCDA)
+ if (MCDA)
{
- std::cout << "You cannot set both MCEA and MCDA. That doesn't mean anything. Run with -h or visit the documentationi for help." << std::endl;
- return false;
+ PopulateRuleList(false);
}
else if (MCEA)
{
- MCOptsProto.AllisSet = true;
- }
- else if (MCDA)
- {
- MCOptsProto.AllisSet = false;
+ PopulateRuleList(true);
}
+
+ ParseString();
+
+ //UpdateRuleList();
return true;
}
private:
+ void PopulateRuleList(bool PopValue)
+ {
+ if ((MisraCVersion & 0x2) == 1)
+ {
+ // C1
+ RuleList.push_back(std::make_pair("0", PopValue));
+
+ typedef std::multimap<std::string,std::string>::const_iterator Iter;
+ for (Iter iter = MC1EquivalencyMap.begin(); iter != MC1EquivalencyMap.end(); ++iter)
+ {
+ if (iter->first != std::prev(iter)->first)
+ {
+ RuleList.push_back(std::make_pair(iter->first, PopValue));
+ }
+ }
+ }
+
+ if ((MisraCVersion & 0x8) == 1)
+ {
+ // C2
+ typedef std::map<std::string, bool>::const_iterator Iter;
+ for (Iter iter = MC2OptsMap.begin(); iter != MC2OptsMap.end(); ++iter)
+ {
+ RuleList.push_back(std::make_pair(iter->first, PopValue));
+ }
+
+ }
+
+ if ((MisraCVersion & 0x20) == 1)
+ {
+ // C3
+ }
+ }
+
+ void ParseString(void)
+ {
+ char* TempChar;
+
+ if (MCDA)
+ {
+ std::strcpy(TempChar, MCE.c_str());
+ char *TokenString = std::strtok(TempChar, " ");
+
+ while (TokenString != NULL)
+ {
+ ParsedString.push_back(std::make_pair(TokenString, true));
+
+ TokenString = std::strtok(TempChar, " ");
+ }
+ }
+
+ if (MCEA)
+ {
+ std::strcpy(TempChar, MCD.c_str());
+ char *TokenString = std::strtok(TempChar, " ");
+
+ while (TokenString != NULL)
+ {
+ ParsedString.push_back(std::make_pair(TokenString, false));
+
+ TokenString = std::strtok(TempChar, " ");
+ }
+ }
+ }
+
+ void UpdateRuleList(void)
+ {
+ for (auto &iter : RuleList)
+ {
+ for (auto &yaiter : ParsedString)
+ {
+ if (iter.first == yaiter.first)
+ {
+ iter.second = yaiter.second;
+ break;
+ }
+ }
+ }
+ }
+
struct MCOptsStructs
{
bool AllisSet;
@@ -241,6 +320,10 @@ private:
};
MCOptsStructs MCOptsProto;
+
+ std::vector<std::pair<std::string, bool>> ParsedString;
+
+ std::vector<std::pair<std::string, bool>> RuleList;
};
/**********************************************************************************************************************/
class [[deprecated("replaced by a more efficient class"), maybe_unused]] MCForCmpless : public MatchFinder::MatchCallback {
@@ -7596,13 +7679,18 @@ int main(int argc, const char **argv)
{
CommonOptionsParser op(argc, argv, MutatorLVL0Cat);
+ CompilationDatabase &CDB [[maybe_unused]] = op.getCompilations();
+ //std::vector<CompileCommand> loco =
+
const std::vector<std::string> &SourcePathList = op.getSourcePathList();
ClangTool Tool(op.getCompilations(), op.getSourcePathList());
StringOptionsParser SOPProto;
-#if 1
+ SOPProto.MC2Parser();
+
+#if 0
if (SOPProto.MC2Parser())
{
typedef std::multimap<std::string, std::string>::iterator Iter;