Skip to content

Commit 8263541

Browse files
committed
Bug hunting; Fixed array init
1 parent 4e90356 commit 8263541

2 files changed

Lines changed: 12 additions & 3 deletions

File tree

lib/exprengine.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -891,8 +891,12 @@ ExprEngine::ArrayValue::ArrayValue(DataBase *data, const Variable *var)
891891
size.push_back(std::make_shared<ExprEngine::IntRange>(data->getNewSymbolName(), 1, ExprEngine::ArrayValue::MAXSIZE));
892892
}
893893

894+
const Token *initToken = var->nameToken();
895+
while (initToken && initToken->str() != "=")
896+
initToken = initToken->astParent();
897+
894898
ValuePtr val;
895-
if (var && !var->isGlobal() && !var->isStatic() && !(var->isArgument() && var->isConst()))
899+
if (var && !var->isGlobal() && !var->isStatic() && !(var->isArgument() && var->isConst()) && !initToken)
896900
val = std::make_shared<ExprEngine::UninitValue>();
897901
else if (var && var->valueType()) {
898902
::ValueType vt(*var->valueType());

test/testexprengine.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class TestExprEngine : public TestFixture {
8787
TEST_CASE(array6);
8888
TEST_CASE(arrayInit1);
8989
TEST_CASE(arrayInit2);
90+
TEST_CASE(arrayInit3);
9091
TEST_CASE(arrayUninit);
9192
TEST_CASE(arrayInLoop);
9293

@@ -615,8 +616,8 @@ class TestExprEngine : public TestFixture {
615616
}
616617

617618
void array2() {
618-
ASSERT_EQUALS("(and (>= |$3:4| 0) (<= |$3:4| 255))\n"
619-
"(= |$3:4| 365)\n"
619+
ASSERT_EQUALS("(and (>= |$4:4| 0) (<= |$4:4| 255))\n"
620+
"(= |$4:4| 365)\n"
620621
"z3::unsat\n",
621622
expr("void dostuff(unsigned char *); int f() { unsigned char arr[10] = \"\"; dostuff(arr); return arr[4] == 365; }", "=="));
622623
}
@@ -672,6 +673,10 @@ class TestExprEngine : public TestFixture {
672673
ASSERT_EQUALS("66", getRange("void f() { char str[] = \"hello\"; str[0] = \'B\'; }", "str[0]=\'B\'"));
673674
}
674675

676+
void arrayInit3() {
677+
ASSERT_EQUALS("-32768:32767", getRange("void f() { short buf[5] = {2, 1, 0, 3, 4}; ret = buf[2]; }", "buf[2]"));
678+
}
679+
675680
void arrayUninit() {
676681
ASSERT_EQUALS("?", getRange("int f() { int arr[10]; return arr[4]; }", "arr[4]"));
677682
}

0 commit comments

Comments
 (0)