Use Platform for char limits computation (#972)
This commit is contained in:
parent
b278436069
commit
151ace2581
|
@ -381,7 +381,9 @@ void CheckFunctions::memsetInvalid2ndParam()
|
||||||
|
|
||||||
if (printWarning && secondParamTok->isNumber()) { // Check if the second parameter is a literal and is out of range
|
if (printWarning && secondParamTok->isNumber()) { // Check if the second parameter is a literal and is out of range
|
||||||
const long long int value = MathLib::toLongNumber(secondParamTok->str());
|
const long long int value = MathLib::toLongNumber(secondParamTok->str());
|
||||||
if (value < -128 || value > 255) // FIXME: Use platform char_bits
|
const long long sCharMin = _settings->signedCharMin();
|
||||||
|
const long long uCharMax = _settings->unsignedCharMax();
|
||||||
|
if (value < sCharMin || value > uCharMax)
|
||||||
memsetValueOutOfRangeError(secondParamTok, secondParamTok->str());
|
memsetValueOutOfRangeError(secondParamTok, secondParamTok->str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,6 +131,18 @@ namespace cppcheck {
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long long unsignedCharMax() const {
|
||||||
|
return max_value(char_bit + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
long long signedCharMax() const {
|
||||||
|
return max_value(char_bit);
|
||||||
|
}
|
||||||
|
|
||||||
|
long long signedCharMin() const {
|
||||||
|
return min_value(char_bit);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -303,8 +303,8 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value, const Setti
|
||||||
else if (valueType.type == ValueType::Type::LONGLONG)
|
else if (valueType.type == ValueType::Type::LONGLONG)
|
||||||
setTokenValue(parent, castValue(value, valueType.sign, settings->long_long_bit), settings);
|
setTokenValue(parent, castValue(value, valueType.sign, settings->long_long_bit), settings);
|
||||||
else if (value.isIntValue()) {
|
else if (value.isIntValue()) {
|
||||||
const int charMax = (1 << (settings->char_bit - 1)) - 1;
|
const long long charMax = settings->signedCharMax();
|
||||||
const int charMin = -charMax - 1;
|
const long long charMin = settings->signedCharMin();
|
||||||
if (charMin <= value.intvalue && value.intvalue <= charMax) {
|
if (charMin <= value.intvalue && value.intvalue <= charMax) {
|
||||||
// unknown type, but value is small so there should be no truncation etc
|
// unknown type, but value is small so there should be no truncation etc
|
||||||
setTokenValue(parent,value,settings);
|
setTokenValue(parent,value,settings);
|
||||||
|
|
Loading…
Reference in New Issue