| // RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=text -verify %s |
| // RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=plist-multi-file %s -o %t.plist |
| // RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/undef-value-param.c.plist - |
| |
| void foo_irrelevant(int c) { |
| if (c) |
| return; |
| c++; |
| return; |
| } |
| void foo(int c, int *x) { |
| if (c) |
| //expected-note@-1{{Assuming 'c' is not equal to 0}} |
| //expected-note@-2{{Taking true branch}} |
| return; // expected-note{{Returning without writing to '*x'}} |
| *x = 5; |
| } |
| |
| int use(int c) { |
| int xx; //expected-note {{'xx' declared without an initial value}} |
| int *y = &xx; |
| foo (c, y); |
| //expected-note@-1{{Calling 'foo'}} |
| //expected-note@-2{{Returning from 'foo'}} |
| foo_irrelevant(c); |
| return xx+3; //expected-warning{{The left operand of '+' is a garbage value}} |
| //expected-note@-1{{The left operand of '+' is a garbage value}} |
| } |
| |
| void initArray(int x, double XYZ[3]) { |
| if (x <= 0) //expected-note {{Taking true branch}} |
| //expected-note@-1 {{Assuming 'x' is <= 0}} |
| return; |
| XYZ[0] = 1; |
| XYZ[1] = 1; |
| XYZ[2] = 1; |
| } |
| int testPassingParentRegionArray(int x) { |
| double XYZ[3]; |
| initArray(x, XYZ); //expected-note {{Calling 'initArray'}} |
| //expected-note@-1 {{Returning from 'initArray'}} |
| return 1 * XYZ[1]; //expected-warning {{The right operand of '*' is a garbage value}} |
| //expected-note@-1 {{The right operand of '*' is a garbage value}} |
| } |
| |
| double *getValidPtr(); |
| struct WithFields { |
| double *f1; |
| }; |
| void initStruct(int x, struct WithFields *X) { |
| if (x <= 0) //expected-note {{Taking true branch}} |
| //expected-note@-1 {{Assuming 'x' is <= 0}} |
| |
| return; //expected-note{{Returning without writing to 'X->f1'}} |
| X->f1 = getValidPtr(); |
| } |
| double testPassingParentRegionStruct(int x) { |
| struct WithFields st; |
| st.f1 = 0; // expected-note {{Null pointer value stored to 'st.f1'}} |
| initStruct(x, &st); //expected-note {{Calling 'initStruct'}} |
| //expected-note@-1 {{Returning from 'initStruct'}} |
| return (*st.f1); //expected-warning {{Dereference of null pointer}} |
| //expected-note@-1{{Dereference of null pointer (loaded from field 'f1')}} |
| } |
| |