diff --git a/Makefile b/Makefile
index 3242804ca..53e96e9d5 100644
--- a/Makefile
+++ b/Makefile
@@ -52,6 +52,7 @@ TESTOBJ = test/testautovariables.o \
test/testpreprocessor.o \
test/testredundantif.o \
test/testrunner.o \
+ test/testsettings.o \
test/testsimplifytokens.o \
test/teststl.o \
test/testsuite.o \
@@ -213,6 +214,9 @@ test/testredundantif.o: test/testredundantif.cpp lib/tokenize.h lib/classinfo.h
test/testrunner.o: test/testrunner.cpp test/testsuite.h lib/errorlogger.h lib/settings.h
$(CXX) $(CXXFLAGS) -Ilib -Icli -c -o test/testrunner.o test/testrunner.cpp
+test/testsettings.o: test/testsettings.cpp lib/settings.h test/testsuite.h lib/errorlogger.h
+ $(CXX) $(CXXFLAGS) -Ilib -Icli -c -o test/testsettings.o test/testsettings.cpp
+
test/testsimplifytokens.o: test/testsimplifytokens.cpp test/testsuite.h lib/errorlogger.h lib/settings.h lib/tokenize.h lib/classinfo.h lib/token.h
$(CXX) $(CXXFLAGS) -Ilib -Icli -c -o test/testsimplifytokens.o test/testsimplifytokens.cpp
diff --git a/lib/settings.cpp b/lib/settings.cpp
index 97d979946..f3a21ba37 100644
--- a/lib/settings.cpp
+++ b/lib/settings.cpp
@@ -53,6 +53,8 @@ bool Settings::Suppressions::parseFile(std::istream &istr)
while (filedata.find("\r") != std::string::npos)
filedata[filedata.find("\r")] = '\n';
+ bool ret = true;
+
// Parse filedata..
std::istringstream istr2(filedata);
while (std::getline(istr2, line))
@@ -74,36 +76,38 @@ bool Settings::Suppressions::parseFile(std::istream &istr)
}
// We could perhaps check if the id is valid and return error if it is not
- addSuppression(id, file, lineNumber);
+ ret &= addSuppression(id, file, lineNumber);
}
- return true;
+ return ret;
}
-void Settings::Suppressions::addSuppression(const std::string &errorId, const std::string &file, unsigned int line)
+bool Settings::Suppressions::addSuppression(const std::string &errorId, const std::string &file, unsigned int line)
{
// Check that errorId is valid..
if (errorId.empty())
{
std::cerr << "Failed to add suppression. No id." << std::endl;
- return;
+ return false;
}
for (std::string::size_type pos = 0; pos < errorId.length(); ++pos)
{
if (errorId[pos] < 0 || !std::isalnum(errorId[pos]))
{
std::cerr << "Failed to add suppression. Invalid id \"" << errorId << "\"" << std::endl;
- return;
+ return false;
}
if (pos == 0 && std::isdigit(errorId[pos]))
{
std::cerr << "Failed to add suppression. Invalid id \"" << errorId << "\"" << std::endl;
- return;
+ return false;
}
}
_suppressions[errorId][file].push_back(line);
_suppressions[errorId][file].sort();
+
+ return true;
}
bool Settings::Suppressions::isSuppressed(const std::string &errorId, const std::string &file, unsigned int line)
diff --git a/lib/settings.h b/lib/settings.h
index 4ce21d54a..32baeb2e4 100644
--- a/lib/settings.h
+++ b/lib/settings.h
@@ -145,8 +145,9 @@ public:
* @param errorId the id for the error, e.g. "arrayIndexOutOfBounds"
* @param file File name with the path, e.g. "src/main.cpp"
* @param line number, e.g. "123"
+ * @return true on success, false in syntax error is noticed.
*/
- void addSuppression(const std::string &errorId, const std::string &file = "", unsigned int line = 0);
+ bool addSuppression(const std::string &errorId, const std::string &file = "", unsigned int line = 0);
/**
* @brief Returns true if this message should not be shown to the user.
diff --git a/test/testsettings.cpp b/test/testsettings.cpp
new file mode 100644
index 000000000..7abfde29c
--- /dev/null
+++ b/test/testsettings.cpp
@@ -0,0 +1,57 @@
+/*
+ * Cppcheck - A tool for static C/C++ code analysis
+ * Copyright (C) 2007-2010 Daniel Marjamäki and Cppcheck team.
+ *
+ * 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 3 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, see .
+ */
+
+#include "settings.h"
+#include "testsuite.h"
+
+#include
+
+extern std::ostringstream errout;
+
+class TestSettings : public TestFixture
+{
+public:
+ TestSettings() : TestFixture("TestSettings")
+ { }
+
+private:
+
+ void run()
+ {
+ TEST_CASE(suppressionsBadId1);
+ TEST_CASE(suppressionsDosFormat); // Ticket #1836
+ }
+
+ void suppressionsBadId1()
+ {
+ Settings::Suppressions suppressions;
+ std::istringstream s("123");
+ ASSERT_EQUALS(false, suppressions.parseFile(s));
+ }
+
+ void suppressionsDosFormat()
+ {
+ Settings::Suppressions suppressions;
+ std::istringstream s("abc\r\ndef\r\n");
+ ASSERT_EQUALS(true, suppressions.parseFile(s));
+ ASSERT_EQUALS(true, suppressions.isSuppressed("abc", "test.cpp", 1));
+ ASSERT_EQUALS(true, suppressions.isSuppressed("def", "test.cpp", 1));
+ }
+};
+
+REGISTER_TEST(TestSettings)