parent
784131ab98
commit
5276fd68b2
|
@ -92,9 +92,6 @@ private:
|
||||||
TEST_CASE(valueFlowSwitchVariable);
|
TEST_CASE(valueFlowSwitchVariable);
|
||||||
|
|
||||||
TEST_CASE(valueFlowForLoop);
|
TEST_CASE(valueFlowForLoop);
|
||||||
// TODO value flow in sub function
|
|
||||||
//TEST_CASE(valueFlowSubFunction);
|
|
||||||
//TEST_CASE(valueFlowSubFunctionLibrary);
|
|
||||||
TEST_CASE(valueFlowFunctionReturn);
|
TEST_CASE(valueFlowFunctionReturn);
|
||||||
|
|
||||||
TEST_CASE(valueFlowFunctionDefaultParameter);
|
TEST_CASE(valueFlowFunctionDefaultParameter);
|
||||||
|
@ -2740,177 +2737,6 @@ private:
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 5U, 3));
|
ASSERT_EQUALS(true, testValueOfX(code, 5U, 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
void valueFlowSubFunction() {
|
|
||||||
const char *code;
|
|
||||||
|
|
||||||
code = "void f1(int x) { return x; }\n"
|
|
||||||
"void f2(int x) {\n"
|
|
||||||
" f1(123);\n"
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 1U, 123));
|
|
||||||
|
|
||||||
code = "void f1(int x) { return x; }\n"
|
|
||||||
"void f2(int x) {\n"
|
|
||||||
" f1(x);\n"
|
|
||||||
" if (x==0){}\n"
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 1U, 0));
|
|
||||||
|
|
||||||
code = "void f1(int x) {\n"
|
|
||||||
" if (x == 0) return;\n"
|
|
||||||
" int y = 1234 / x;\n"
|
|
||||||
"}\n"
|
|
||||||
"\n"
|
|
||||||
"void f2() {\n"
|
|
||||||
" f1(0);\n"
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 0));
|
|
||||||
|
|
||||||
code = "void f1(int x) {\n"
|
|
||||||
" if (x == 0) return;\n"
|
|
||||||
" int y = x;\n"
|
|
||||||
"}\n"
|
|
||||||
"\n"
|
|
||||||
"void f2() {\n"
|
|
||||||
" f1(x&4);\n" // possible {0,4}
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 0));
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 4));
|
|
||||||
|
|
||||||
code = "int f(int i) {\n"
|
|
||||||
" if(i >= 2)\n"
|
|
||||||
" return 0;\n"
|
|
||||||
" else if(i == 0)\n"
|
|
||||||
" return 0;\n"
|
|
||||||
" int a = i;\n"
|
|
||||||
"}\n"
|
|
||||||
"void g(int i) {\n"
|
|
||||||
" return f(0);\n"
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 6U, 0));
|
|
||||||
|
|
||||||
code = "void f1(int x) { a=x; }\n"
|
|
||||||
"void f2(int y) { f1(y<123); }\n";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 1U, 0));
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 1U, 1));
|
|
||||||
|
|
||||||
code = "void f1(int x) { a=(abc)x; }\n"
|
|
||||||
"void f2(int y) { f1(123); }\n";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 1U, 123));
|
|
||||||
|
|
||||||
code = "void f1(int x) {\n"
|
|
||||||
" x ?\n"
|
|
||||||
" 1024 / x :\n"
|
|
||||||
" 0; }\n"
|
|
||||||
"void f2() { f1(0); }";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 2U, 0));
|
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 0));
|
|
||||||
|
|
||||||
code = "void f1(int *x) {\n"
|
|
||||||
" if (x &&\n"
|
|
||||||
" *x) {}\n"
|
|
||||||
"}\n"
|
|
||||||
"void f2() { f1(0); }";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 2U, 0));
|
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 0));
|
|
||||||
|
|
||||||
// #5861 - fp with float
|
|
||||||
code = "void f1(float x) {\n"
|
|
||||||
" return 1.0 / x;\n"
|
|
||||||
"}\n"
|
|
||||||
"void f2() { f1(0.5); }";
|
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 2U, 0));
|
|
||||||
|
|
||||||
code = "void dostuff(int x) {\n"
|
|
||||||
" return x/x;\n"
|
|
||||||
"}\n"
|
|
||||||
"\n"
|
|
||||||
"void test(int x) {\n"
|
|
||||||
" if(x==1) {}\n"
|
|
||||||
" dostuff(x+1);\n"
|
|
||||||
"}\n";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 2U, 2));
|
|
||||||
|
|
||||||
code = "void leaveNotifyEvent(const XCrossingEvent * const) { }\n"
|
|
||||||
"void motionNotifyEvent() {\n"
|
|
||||||
" leaveNotifyEvent(0);\n"
|
|
||||||
"}";
|
|
||||||
testValueOfX(code, 2U, 2); // No complaint about Token::Match called with varid 0. (#6443)
|
|
||||||
|
|
||||||
// #6560 - multivariables
|
|
||||||
code = "void f1(int x) {\n"
|
|
||||||
" int a = x && y;\n"
|
|
||||||
" int b = a ? x : 0;\n"
|
|
||||||
"}\n"
|
|
||||||
"void f2() {\n"
|
|
||||||
" f1(0);\n"
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 0));
|
|
||||||
|
|
||||||
code = "class A\n"
|
|
||||||
"{\n"
|
|
||||||
" void f1(int x) { return x; }\n"
|
|
||||||
" void f2(int x) {\n"
|
|
||||||
" f1(123);\n"
|
|
||||||
" }\n"
|
|
||||||
"};";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 123));
|
|
||||||
|
|
||||||
code = "class A\n"
|
|
||||||
"{\n"
|
|
||||||
" virtual void f1(int x) { return x; }\n"
|
|
||||||
" void f2(int x) {\n"
|
|
||||||
" f1(123);\n"
|
|
||||||
" }\n"
|
|
||||||
"};";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 123));
|
|
||||||
|
|
||||||
code = "void foo(int x, int y) {\n"
|
|
||||||
" if (y == 1) {\n"
|
|
||||||
" a = x;\n" // <- x is not 1
|
|
||||||
" }\n"
|
|
||||||
"}\n"
|
|
||||||
"\n"
|
|
||||||
"void bar() {\n"
|
|
||||||
" foo(1, 10);\n"
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
void valueFlowSubFunctionLibrary() {
|
|
||||||
const char *code;
|
|
||||||
|
|
||||||
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
|
|
||||||
"<def>\n"
|
|
||||||
" <function name=\"add\">\n"
|
|
||||||
" <returnValue>arg1+arg2</returnValue>\n"
|
|
||||||
" <arg nr=\"1\"/>\n"
|
|
||||||
" <arg nr=\"2\"/>\n"
|
|
||||||
" </function>\n"
|
|
||||||
"</def>";
|
|
||||||
|
|
||||||
settings.library.loadxmldata(xmldata, sizeof(xmldata));
|
|
||||||
|
|
||||||
code = "void f() {\n"
|
|
||||||
" int x = add(100, 23);\n"
|
|
||||||
" return x;\n"
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 123));
|
|
||||||
|
|
||||||
code = "void f() {\n"
|
|
||||||
" int a;\n"
|
|
||||||
" if (cond)\n"
|
|
||||||
" a = 1;\n"
|
|
||||||
" else\n"
|
|
||||||
" a = 2;\n"
|
|
||||||
" add(a, a);\n"
|
|
||||||
"}";
|
|
||||||
std::list<ValueFlow::Value> values = tokenValues(code, "( a , a )");
|
|
||||||
ASSERT_EQUALS(2, values.size());
|
|
||||||
ASSERT_EQUALS(2, values.front().intvalue);
|
|
||||||
ASSERT_EQUALS(4, values.back().intvalue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void valueFlowFunctionReturn() {
|
void valueFlowFunctionReturn() {
|
||||||
const char *code;
|
const char *code;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue