ExprEngine: some handling of NULL pointer
This commit is contained in:
parent
a903aa7070
commit
9025b47f82
|
@ -636,6 +636,13 @@ static ExprEngine::ValuePtr executeVariable(const Token *tok, Data &data)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ExprEngine::ValuePtr executeKnownMacro(const Token *tok, Data &data)
|
||||||
|
{
|
||||||
|
auto val = std::make_shared<ExprEngine::IntRange>(data.getNewSymbolName(), tok->getKnownIntValue(), tok->getKnownIntValue());
|
||||||
|
call(data.callbacks, tok, val);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
static ExprEngine::ValuePtr executeNumber(const Token *tok)
|
static ExprEngine::ValuePtr executeNumber(const Token *tok)
|
||||||
{
|
{
|
||||||
if (tok->valueType()->isFloat()) {
|
if (tok->valueType()->isFloat()) {
|
||||||
|
@ -682,6 +689,9 @@ static ExprEngine::ValuePtr executeExpression(const Token *tok, Data &data)
|
||||||
if (tok->varId())
|
if (tok->varId())
|
||||||
return executeVariable(tok, data);
|
return executeVariable(tok, data);
|
||||||
|
|
||||||
|
if (tok->isName() && tok->hasKnownIntValue())
|
||||||
|
return executeKnownMacro(tok, data);
|
||||||
|
|
||||||
if (tok->isNumber())
|
if (tok->isNumber())
|
||||||
return executeNumber(tok);
|
return executeNumber(tok);
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ private:
|
||||||
TEST_CASE(pointerAlias2);
|
TEST_CASE(pointerAlias2);
|
||||||
TEST_CASE(pointerAlias3);
|
TEST_CASE(pointerAlias3);
|
||||||
TEST_CASE(pointerAlias4);
|
TEST_CASE(pointerAlias4);
|
||||||
|
TEST_CASE(pointerNull1);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string getRange(const char code[], const std::string &str, int linenr = 0) {
|
std::string getRange(const char code[], const std::string &str, int linenr = 0) {
|
||||||
|
@ -213,6 +214,10 @@ private:
|
||||||
void pointerAlias4() {
|
void pointerAlias4() {
|
||||||
ASSERT_EQUALS("71", getRange("int f() { int x[10]; int *p = x+3; *p = 71; return x[3]; }", "x[3]"));
|
ASSERT_EQUALS("71", getRange("int f() { int x[10]; int *p = x+3; *p = 71; return x[3]; }", "x[3]"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pointerNull1() {
|
||||||
|
ASSERT_EQUALS("1", getRange("void f(void *p) { p = NULL; p += 1; }", "p+=1"));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestExprEngine)
|
REGISTER_TEST(TestExprEngine)
|
||||||
|
|
Loading…
Reference in New Issue