Fix FP incorrectStringBooleanError with macro (#5358)
This commit is contained in:
parent
05a2d88ec8
commit
af46c68a94
2
Makefile
2
Makefile
|
@ -821,7 +821,7 @@ test/testsizeof.o: test/testsizeof.cpp externals/simplecpp/simplecpp.h lib/check
|
|||
test/teststl.o: test/teststl.cpp lib/check.h lib/checkstl.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h
|
||||
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststl.cpp
|
||||
|
||||
test/teststring.o: test/teststring.cpp lib/check.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h
|
||||
test/teststring.o: test/teststring.cpp externals/simplecpp/simplecpp.h lib/check.h lib/checkstring.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h
|
||||
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/teststring.cpp
|
||||
|
||||
test/testsummaries.o: test/testsummaries.cpp lib/check.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/summaries.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h
|
||||
|
|
|
@ -288,7 +288,9 @@ void CheckString::checkIncorrectStringCompare()
|
|||
incorrectStringCompareError(tok->next(), "substr", end->strAt(1));
|
||||
}
|
||||
}
|
||||
} else if (Token::Match(tok, "%str%|%char%") && isUsedAsBool(tok))
|
||||
} else if (Token::Match(tok, "%str%|%char%") &&
|
||||
!(tok->astParent() && tok->astParent()->isExpandedMacro()) &&
|
||||
isUsedAsBool(tok))
|
||||
incorrectStringBooleanError(tok, tok->str());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
#include "fixture.h"
|
||||
#include "tokenize.h"
|
||||
|
||||
#include <simplecpp.h>
|
||||
|
||||
#include <sstream> // IWYU pragma: keep
|
||||
|
||||
|
||||
|
@ -60,15 +62,24 @@ private:
|
|||
TEST_CASE(deadStrcmp);
|
||||
}
|
||||
|
||||
#define check(...) check_(__FILE__, __LINE__, __VA_ARGS__)
|
||||
void check_(const char* file, int line, const char code[], const char filename[] = "test.cpp") {
|
||||
void check(const char code[], const char filename[] = "test.cpp") {
|
||||
// Clear the error buffer..
|
||||
errout.str("");
|
||||
|
||||
// Raw tokens..
|
||||
std::vector<std::string> files(1, filename);
|
||||
std::istringstream istr(code);
|
||||
const simplecpp::TokenList tokens1(istr, files, files[0]);
|
||||
|
||||
// Preprocess..
|
||||
simplecpp::TokenList tokens2(files);
|
||||
std::map<std::string, simplecpp::TokenList*> filedata;
|
||||
simplecpp::preprocess(tokens2, tokens1, files, filedata, simplecpp::DUI());
|
||||
|
||||
// Tokenize..
|
||||
Tokenizer tokenizer(&settings, this);
|
||||
std::istringstream istr(code);
|
||||
ASSERT_LOC(tokenizer.tokenize(istr, filename), file, line);
|
||||
tokenizer.createTokens(std::move(tokens2));
|
||||
tokenizer.simplifyTokens1("");
|
||||
|
||||
// Check char variable usage..
|
||||
runChecks<CheckString>(tokenizer, this);
|
||||
|
@ -768,6 +779,12 @@ private:
|
|||
ASSERT_EQUALS("[test.cpp:3]: (warning) Conversion of char literal '\\0' to bool always evaluates to false.\n"
|
||||
"[test.cpp:4]: (warning) Conversion of char literal 'a' to bool always evaluates to true.\n",
|
||||
errout.str());
|
||||
|
||||
check("#define ERROR(msg) if (msg) printf(\"%s\\n\", msg);\n"
|
||||
"void f() {\n"
|
||||
" ERROR(\"abc\")\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void deadStrcmp() {
|
||||
|
|
Loading…
Reference in New Issue