Fixed #7775 (crash at valueFlowSetConstantValue)

This commit is contained in:
Robert Reif 2016-10-26 10:36:02 +02:00 committed by Daniel Marjamäki
parent 08a618c476
commit 4216b26b8c
2 changed files with 16 additions and 7 deletions

View File

@ -636,6 +636,7 @@ static Token * valueFlowSetConstantValue(const Token *tok, const Settings *setti
setTokenValue(const_cast<Token *>(tok->next()), value); setTokenValue(const_cast<Token *>(tok->next()), value);
} else if (tok2->type() && tok2->type()->isEnumType()) { } else if (tok2->type() && tok2->type()->isEnumType()) {
long long size = settings->sizeof_int; long long size = settings->sizeof_int;
if (tok2->type()->classScope) {
const Token * type = tok2->type()->classScope->enumType; const Token * type = tok2->type()->classScope->enumType;
if (type) { if (type) {
size = type->str() == "char" ? 1 : size = type->str() == "char" ? 1 :
@ -644,6 +645,7 @@ static Token * valueFlowSetConstantValue(const Token *tok, const Settings *setti
(type->str() == "long" && type->isLong()) ? settings->sizeof_long_long : (type->str() == "long" && type->isLong()) ? settings->sizeof_long_long :
type->str() == "long" ? settings->sizeof_long : 0; type->str() == "long" ? settings->sizeof_long : 0;
} }
}
ValueFlow::Value value(size); ValueFlow::Value value(size);
value.setKnown(); value.setKnown();
setTokenValue(const_cast<Token *>(tok), value); setTokenValue(const_cast<Token *>(tok), value);

View File

@ -77,6 +77,8 @@ private:
TEST_CASE(valueFlowFunctionDefaultParameter); TEST_CASE(valueFlowFunctionDefaultParameter);
TEST_CASE(knownValue); TEST_CASE(knownValue);
TEST_CASE(valueFlowSizeofForwardDeclaredEnum);
} }
bool testValueOfX(const char code[], unsigned int linenr, int value) { bool testValueOfX(const char code[], unsigned int linenr, int value) {
@ -2011,6 +2013,11 @@ private:
ASSERT_EQUALS(false, testValueOfX(code, 4U, 7)); ASSERT_EQUALS(false, testValueOfX(code, 4U, 7));
ASSERT(value.isKnown()); ASSERT(value.isKnown());
} }
void valueFlowSizeofForwardDeclaredEnum() {
const char *code = "enum E; sz=sizeof(E);";
valueOfTok(code, "="); // Don't crash (#7775)
}
}; };
REGISTER_TEST(TestValueFlow) REGISTER_TEST(TestValueFlow)