| 5592 | } |
| 5593 | |
| 5594 | void valueFlowUninitTest() { |
| 5595 | // #9735 - FN |
| 5596 | valueFlowUninit("typedef struct\n" |
| 5597 | "{\n" |
| 5598 | " int x;\n" |
| 5599 | " unsigned int flag : 1;\n" // bit filed gets never initialized |
| 5600 | "} status;\n" |
| 5601 | "bool foo(const status * const s)\n" |
| 5602 | "{\n" |
| 5603 | " return s->flag;\n" // << uninitvar |
| 5604 | "}\n" |
| 5605 | "void bar(const status * const s)\n" |
| 5606 | "{\n" |
| 5607 | " if( foo(s) == 1) {;}\n" |
| 5608 | "}\n" |
| 5609 | "void f(void)\n" |
| 5610 | "{\n" |
| 5611 | " status s;\n" |
| 5612 | " s.x = 42;\n" |
| 5613 | " bar(&s);\n" |
| 5614 | "}"); |
| 5615 | ASSERT_EQUALS("[test.cpp:18:9] -> [test.cpp:12:13] -> [test.cpp:8:15]: (warning) Uninitialized variable: s->flag [uninitvar]\n", errout_str()); |
| 5616 | |
| 5617 | // Ticket #2207 - False negative |
| 5618 | valueFlowUninit("void foo() {\n" |
| 5619 | " int a;\n" |
| 5620 | " b = c - a;\n" |
| 5621 | "}"); |
| 5622 | ASSERT_EQUALS("[test.cpp:3:13]: (error) Uninitialized variable: a [uninitvar]\n", errout_str()); |
| 5623 | |
| 5624 | valueFlowUninit("void foo() {\n" |
| 5625 | " int a;\n" |
| 5626 | " b = a - c;\n" |
| 5627 | "}"); |
| 5628 | ASSERT_EQUALS("[test.cpp:3:9]: (error) Uninitialized variable: a [uninitvar]\n", errout_str()); |
| 5629 | |
| 5630 | // Ticket #6455 - some compilers allow const variables to be uninitialized |
| 5631 | // extracttests.disable |
| 5632 | valueFlowUninit("void foo() {\n" |
| 5633 | " const int a;\n" |
| 5634 | " b = c - a;\n" |
| 5635 | "}"); |
| 5636 | ASSERT_EQUALS("[test.cpp:3:13]: (error) Uninitialized variable: a [uninitvar]\n", errout_str()); |
| 5637 | // extracttests.enable |
| 5638 | |
| 5639 | valueFlowUninit("void foo() {\n" |
| 5640 | " int *p;\n" |
| 5641 | " realloc(p,10);\n" |
| 5642 | "}"); |
| 5643 | ASSERT_EQUALS("[test.cpp:3:13]: (error) Uninitialized variable: p [uninitvar]\n", errout_str()); |
| 5644 | |
| 5645 | valueFlowUninit("void foo() {\n" // #5240 |
| 5646 | " char *p = malloc(100);\n" |
| 5647 | " char *tmp = realloc(p,1000);\n" |
| 5648 | " if (!tmp) free(p);\n" |
| 5649 | "}"); |
| 5650 | ASSERT_EQUALS("", errout_str()); |
| 5651 |
nothing calls this directly
no test coverage detected