diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 48b2a1ae4bf..0d423b6f3dd 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -2009,7 +2009,8 @@ void CheckConditionImpl::checkCompareValueOutOfTypeRange() for (int i = 0; i < 2; ++i) { const Token * const valueTok = (i == 0) ? tok->astOperand1() : tok->astOperand2(); const Token * const typeTok = valueTok->astSibling(); - if (!valueTok->hasKnownIntValue() || !typeTok->valueType() || typeTok->valueType()->pointer) + const ValueType* const typeVt = typeTok->valueType(); + if (!valueTok->hasKnownIntValue() || !typeVt || typeVt->pointer) continue; if (valueTok->getKnownIntValue() < 0 && valueTok->valueType() && valueTok->valueType()->sign != ValueType::Sign::SIGNED) continue; @@ -2041,10 +2042,10 @@ void CheckConditionImpl::checkCompareValueOutOfTypeRange() if (bits == 0 || bits >= 63) continue; - const auto typeMinValue = (typeTok->valueType()->sign == ValueType::Sign::UNSIGNED) ? 0 : (-(1LL << (bits-1))); + const auto typeMinValue = (typeVt->sign == ValueType::Sign::UNSIGNED) ? 0 : (-(1LL << (bits-1))); const auto unsignedTypeMaxValue = (1LL << bits) - 1LL; long long typeMaxValue; - if (typeTok->valueType()->sign != ValueType::Sign::SIGNED) + if (typeVt->sign != ValueType::Sign::SIGNED && !(typeVt->sign == ValueType::Sign::UNKNOWN_SIGN && typeVt->type == ValueType::Type::CHAR && mSettings.platform.defaultSign == 's')) typeMaxValue = unsignedTypeMaxValue; else if (bits >= mSettings.platform.int_bit && (!valueTok->valueType() || valueTok->valueType()->sign != ValueType::Sign::SIGNED)) typeMaxValue = unsignedTypeMaxValue; @@ -2105,7 +2106,7 @@ void CheckConditionImpl::checkCompareValueOutOfTypeRange() } if (!error || diag(tok)) continue; - compareValueOutOfTypeRangeError(valueTok, typeTok->valueType()->str(), kiv, result); + compareValueOutOfTypeRangeError(valueTok, typeVt->str(), kiv, result); } } } diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 93248837cb3..b23bcc2e20b 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -6652,6 +6652,12 @@ class TestCondition : public TestFixture { "[test.cpp:2:28]: (style) Comparing expression of type 'signed int' against value 2147483647. Condition is always false. [compareValueOutOfTypeRangeError]\n" "[test.cpp:7:17]: (style) Comparing expression of type 'signed int' against value 2147483647. Condition is always false. [compareValueOutOfTypeRangeError]\n", errout_str()); + + check("void f(char c) {\n" // #11592 + " if (c == 128) {}\n" + "}\n", settingsUnix64); + ASSERT_EQUALS("[test.cpp:2:14]: (style) Comparing expression of type 'char' against value 128. Condition is always false. [compareValueOutOfTypeRangeError]\n", + errout_str()); } void knownConditionCast() {