Clang Project

clang_source_code/test/Analysis/diagnostics/deref-track-symbolic-region.c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=text -verify %s
2// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=plist-multi-file  %s -o %t.plist
3// RUN: cat %t.plist | %diff_plist %S/Inputs/expected-plists/deref-track-symbolic-region.c.plist -
4
5struct S {
6  int *x;
7  int y;
8};
9
10int *foo();
11
12void test(struct S syz, int *pp) {
13  int m = 0;
14  syz.x = foo(); // expected-note{{Value assigned to 'syz.x'}}
15
16  struct S *ps = &syz;
17  if (ps->x)
18    //expected-note@-1{{Taking false branch}}
19    //expected-note@-2{{Assuming pointer value is null}}
20
21    m++;
22
23  m += *syz.x; // expected-warning{{Dereference of null pointer (loaded from field 'x')}}
24  // expected-note@-1{{Dereference of null pointer (loaded from field 'x')}}
25}
26
27void testTrackConstraintBRVisitorIsTrackingTurnedOn(struct S syz, int *pp) {
28  int m = 0;
29  syz.x = foo(); // expected-note{{Value assigned to 'syz.x'}}
30
31  struct S *ps = &syz;
32  if (ps->x)
33    //expected-note@-1{{Taking false branch}}
34    //expected-note@-2{{Assuming pointer value is null}}
35
36    m++;
37  int *p = syz.x; //expected-note {{'p' initialized to a null pointer value}}
38  m = *p; // expected-warning {{Dereference of null pointer (loaded from variable 'p')}}
39          // expected-note@-1 {{Dereference of null pointer (loaded from variable 'p')}}
40}
41
42