diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 7b02ac2b8..aa2246390 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -558,10 +558,15 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value) result.inconclusive = value1->inconclusive | value2->inconclusive; result.varId = (value1->varId != 0U) ? value1->varId : value2->varId; result.varvalue = (result.varId == value1->varId) ? value1->intvalue : value2->intvalue; + if (value1->valueKind == value2->valueKind) + result.valueKind = value1->valueKind; if (value1->tokvalue->tokType() == Token::eString) { const std::string s = value1->tokvalue->strValue(); const MathLib::bigint index = value2->intvalue; - if (index >= 0 && index < s.size()) { + if (index == s.size()) { + result.intvalue = 0; + setTokenValue(parent, result); + } else if (index >= 0 && index < s.size()) { result.intvalue = s[index]; setTokenValue(parent, result); } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 37294df9e..730300a8c 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -236,6 +236,18 @@ private: " *x = 0;\n" // .. => x value is a "}"; ASSERT_EQUALS(true, testValueOfX(code, 4, "a")); + + code = "char f() {\n" + " const char *x = \"abcd\";\n" + " return x[0];\n" + "}"; + ASSERT_EQUALS((int)('a'), valueOfTok(code, "[").intvalue); + + code = "char f() {\n" + " const char *x = \"\";\n" + " return x[0];\n" + "}"; + ASSERT_EQUALS(0, valueOfTok(code, "[").intvalue); } void valueFlowCalculations() {