Skip to content

Commit 2450cd9

Browse files
committed
Enable suppressions conditionally
1 parent d6d79ef commit 2450cd9

2 files changed

Lines changed: 67 additions & 49 deletions

File tree

lib/suppressions.cpp

Lines changed: 64 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,51 @@ std::string SuppressionList::Suppression::toString() const
649649
return s;
650650
}
651651

652+
polyspace::Parser::Parser(const Settings &settings)
653+
{
654+
const auto matchArg = [&](const std::string &arg) {
655+
const std::string args = settings.premiumArgs;
656+
const std::string::size_type pos = args.find(arg);
657+
658+
if (pos == std::string::npos)
659+
return false;
660+
661+
if (pos > 0 && args[pos - 1] != ' ')
662+
return false;
663+
664+
return pos == args.size() - arg.size() || args[pos + arg.size()] == ' ';
665+
};
666+
667+
if (settings.addons.count("misra") != 0) {
668+
mFamilyMap["MISRA-C3"] = "misra-c2012-";
669+
mFamilyMap["MISRA2012"] = "misra-c2012-";
670+
}
671+
672+
if (matchArg("--misra-c-2012")) {
673+
mFamilyMap["MISRA-C3"] = "premium-misra-c-2012-";
674+
mFamilyMap["MISRA2012"] = "premium-misra-c-2012-";
675+
}
676+
677+
if (matchArg("--misra-c-2023"))
678+
mFamilyMap["MISRA-C-2023"] = "premium-misra-c-2023-";
679+
680+
if (matchArg("--misra-cpp-2008") || matchArg("--misra-c++-2008"))
681+
mFamilyMap["MISRA-CPP"] = "premium-misra-cpp-2008-";
682+
683+
if (matchArg("--misra-cpp-2023") || matchArg("--misra-c++-2023"))
684+
mFamilyMap["MISRA-CPP-2023"] = "premium-misra-cpp-2023-";
685+
686+
if (matchArg("--cert-c") || matchArg("--cert-c-2016"))
687+
mFamilyMap["CERT-C"] = "premium-cert-c-";
688+
689+
if (matchArg("--cert-cpp") || matchArg("--cert-c++") ||
690+
matchArg("--cert-cpp-2016") || matchArg("--cert-c++-2016"))
691+
mFamilyMap["CERT-CPP"] = "premium-cert-cpp-";
692+
693+
if (matchArg("--autosar"))
694+
mFamilyMap["AUTOSAR-CPP14"] = "premium-autosar-";
695+
}
696+
652697
std::string polyspace::Parser::peekToken()
653698
{
654699
if (!mHasPeeked) {
@@ -807,9 +852,26 @@ bool polyspace::Parser::parseEntry()
807852
void polyspace::Parser::collect(SuppressionList &suppressions) const
808853
{
809854
for (const auto &polyspaceSuppr : mDone) {
855+
const auto it = mFamilyMap.find(polyspaceSuppr.family);
856+
if (it == mFamilyMap.cend())
857+
continue;
858+
810859
SuppressionList::Suppression suppr;
811-
if (polyspaceSuppr.convert(mSettings, suppr))
812-
suppressions.addSuppression(std::move(suppr));
860+
suppr.errorId = it->second + polyspaceSuppr.resultName;
861+
suppr.isInline = true;
862+
suppr.isPolyspace = true;
863+
suppr.fileName = polyspaceSuppr.filename;
864+
865+
suppr.lineNumber = polyspaceSuppr.lineBegin;
866+
if (polyspaceSuppr.lineBegin == polyspaceSuppr.lineEnd) {
867+
suppr.type = SuppressionList::Type::unique;
868+
} else {
869+
suppr.type = SuppressionList::Type::block;
870+
suppr.lineBegin = polyspaceSuppr.lineBegin;
871+
suppr.lineEnd = polyspaceSuppr.lineEnd;
872+
}
873+
874+
suppressions.addSuppression(std::move(suppr));
813875
}
814876
}
815877

@@ -865,47 +927,3 @@ bool polyspace::Suppression::matches(const polyspace::Suppression &other) const
865927
{
866928
return family == other.family && resultName == other.resultName;
867929
}
868-
869-
bool polyspace::Suppression::convert(const Settings &settings, SuppressionList::Suppression &suppr) const
870-
{
871-
static const std::map<std::string, std::string> map = {
872-
{ "MISRA-C-2023", "premium-misra-c-2023-" },
873-
{ "MISRA-CPP", "premium-misra-cpp-2008-" },
874-
{ "MISRA-CPP-2023", "premium-misra-cpp-2023-" },
875-
{ "CERT-C", "premium-cert-c-" },
876-
{ "CERT-CPP", "premium-cert-cpp-" },
877-
{ "AUTOSAR-CPP14", "premium-autosar-" },
878-
};
879-
880-
const auto it = map.find(family);
881-
std::string prefix;
882-
if (it == map.cend()) {
883-
if (family == "MISRA-C3" || family == "MISRA2012") {
884-
if (settings.premiumArgs.empty()) {
885-
prefix = "misra-c2012-";
886-
} else {
887-
prefix = "premium-misra-c-2012-";
888-
}
889-
} else {
890-
return false;
891-
}
892-
} else {
893-
prefix = it->second;
894-
}
895-
896-
suppr.errorId = prefix + resultName;
897-
suppr.isInline = true;
898-
suppr.isPolyspace = true;
899-
suppr.fileName = filename;
900-
901-
suppr.lineNumber = lineBegin;
902-
if (lineBegin == lineEnd) {
903-
suppr.type = SuppressionList::Type::unique;
904-
} else {
905-
suppr.type = SuppressionList::Type::block;
906-
suppr.lineBegin = lineBegin;
907-
suppr.lineEnd = lineEnd;
908-
}
909-
910-
return true;
911-
}

lib/suppressions.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include <string>
3232
#include <utility>
3333
#include <vector>
34+
#include <map>
3435

3536
class Tokenizer;
3637
class ErrorMessage;
@@ -306,13 +307,12 @@ namespace polyspace {
306307
int lineEnd;
307308

308309
bool matches(const Suppression &other) const;
309-
bool convert(const Settings &settings, SuppressionList::Suppression &suppr) const;
310310
};
311311

312312
class CPPCHECKLIB Parser {
313313
public:
314314
Parser() = delete;
315-
explicit Parser(const Settings &settings) : mSettings(settings) {}
315+
explicit Parser(const Settings &settings);
316316
void collect(SuppressionList &suppressions) const;
317317
void parse(const std::string &comment, int line, const std::string &filename);
318318

@@ -337,7 +337,7 @@ namespace polyspace {
337337
std::string mResultName;
338338
std::string mPeeked;
339339
bool mHasPeeked{};
340-
const Settings &mSettings;
340+
std::map<std::string, std::string> mFamilyMap;
341341
};
342342

343343
bool CPPCHECKLIB isPolyspaceComment(const std::string &comment);

0 commit comments

Comments
 (0)