Fixed #7888 (false positive from knownConditionTrueFalse with sizeof(int) == sizeof(long))
This commit is contained in:
parent
34a56506cb
commit
bc7799dccd
|
@ -699,6 +699,8 @@ bool CmdLineParser::ParseFromArgs(int argc, const char* const argv[])
|
|||
else if (platform == "unix64")
|
||||
_settings->platform(Settings::Unix64);
|
||||
else if (platform == "native")
|
||||
_settings->platform(Settings::Native);
|
||||
else if (platform == "unspecified")
|
||||
_settings->platform(Settings::Unspecified);
|
||||
else if (!_settings->platformFile(platform)) {
|
||||
std::string message("cppcheck: error: unrecognized platform: \"");
|
||||
|
@ -943,8 +945,10 @@ void CmdLineParser::PrintHelp()
|
|||
" * win64\n"
|
||||
" 64 bit Windows\n"
|
||||
" * native\n"
|
||||
" Unspecified platform. Type sizes of host system\n"
|
||||
" are assumed, but no further assumptions.\n"
|
||||
" Type sizes of host system are assumed, but no\n"
|
||||
" further assumptions.\n"
|
||||
" * unspecified\n"
|
||||
" Unknown type sizes\n"
|
||||
" -q, --quiet Do not show progress reports.\n"
|
||||
" -rp, --relative-paths\n"
|
||||
" -rp=<paths>, --relative-paths=<paths>\n"
|
||||
|
|
|
@ -36,26 +36,7 @@ cppcheck::Platform::Platform()
|
|||
bool cppcheck::Platform::platform(cppcheck::Platform::PlatformType type)
|
||||
{
|
||||
switch (type) {
|
||||
case Unspecified:
|
||||
platformType = type;
|
||||
sizeof_bool = sizeof(bool);
|
||||
sizeof_short = sizeof(short);
|
||||
sizeof_int = sizeof(int);
|
||||
sizeof_long = sizeof(long);
|
||||
sizeof_long_long = sizeof(long long);
|
||||
sizeof_float = sizeof(float);
|
||||
sizeof_double = sizeof(double);
|
||||
sizeof_long_double = sizeof(long double);
|
||||
sizeof_wchar_t = sizeof(wchar_t);
|
||||
sizeof_size_t = sizeof(std::size_t);
|
||||
sizeof_pointer = sizeof(void *);
|
||||
defaultSign = '\0';
|
||||
char_bit = 8;
|
||||
short_bit = char_bit * sizeof_short;
|
||||
int_bit = char_bit * sizeof_int;
|
||||
long_bit = char_bit * sizeof_long;
|
||||
long_long_bit = char_bit * sizeof_long_long;
|
||||
return true;
|
||||
case Unspecified: // unknown type sizes (sizes etc are set but are not known)
|
||||
case Native: // same as system this code was compile on
|
||||
platformType = type;
|
||||
sizeof_bool = sizeof(bool);
|
||||
|
@ -69,7 +50,9 @@ bool cppcheck::Platform::platform(cppcheck::Platform::PlatformType type)
|
|||
sizeof_wchar_t = sizeof(wchar_t);
|
||||
sizeof_size_t = sizeof(std::size_t);
|
||||
sizeof_pointer = sizeof(void *);
|
||||
{
|
||||
if (type == Unspecified) {
|
||||
defaultSign = '\0';
|
||||
} else {
|
||||
char x = -1;
|
||||
defaultSign = (x < 0) ? 's' : 'u';
|
||||
}
|
||||
|
|
|
@ -643,6 +643,7 @@ static Token * valueFlowSetConstantValue(const Token *tok, const Settings *setti
|
|||
type->str() == "long" ? settings->sizeof_long : 0;
|
||||
}
|
||||
ValueFlow::Value value(size);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok), value, settings);
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
|
@ -659,6 +660,7 @@ static Token * valueFlowSetConstantValue(const Token *tok, const Settings *setti
|
|||
}
|
||||
}
|
||||
ValueFlow::Value value(size);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok), value, settings);
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
|
@ -674,6 +676,7 @@ static Token * valueFlowSetConstantValue(const Token *tok, const Settings *setti
|
|||
sz1->variable()->dimensionKnown(0) &&
|
||||
(Token::Match(sz2, "* %varid% )", varid1) || Token::Match(sz2, "%varid% [ 0 ] )", varid1))) {
|
||||
ValueFlow::Value value(sz1->variable()->dimension(0));
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok->tokAt(4)), value, settings);
|
||||
}
|
||||
|
@ -681,34 +684,42 @@ static Token * valueFlowSetConstantValue(const Token *tok, const Settings *setti
|
|||
const ValueType &vt = ValueType::parseDecl(tok2,settings);
|
||||
if (vt.pointer) {
|
||||
ValueFlow::Value value(settings->sizeof_pointer);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
} else if (vt.type == ValueType::Type::CHAR) {
|
||||
ValueFlow::Value value(1);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
} else if (vt.type == ValueType::Type::SHORT) {
|
||||
ValueFlow::Value value(settings->sizeof_short);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
} else if (vt.type == ValueType::Type::INT) {
|
||||
ValueFlow::Value value(settings->sizeof_int);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
} else if (vt.type == ValueType::Type::LONG) {
|
||||
ValueFlow::Value value(settings->sizeof_long);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
} else if (vt.type == ValueType::Type::LONGLONG) {
|
||||
ValueFlow::Value value(settings->sizeof_long_long);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
} else if (vt.type == ValueType::Type::FLOAT) {
|
||||
ValueFlow::Value value(settings->sizeof_float);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
} else if (vt.type == ValueType::Type::DOUBLE) {
|
||||
ValueFlow::Value value(settings->sizeof_double);
|
||||
if (settings->platformType != cppcheck::Platform::Unspecified)
|
||||
value.setKnown();
|
||||
setTokenValue(const_cast<Token *>(tok->next()), value, settings);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue