reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.NewDelete,core,alpha.core.CallAndMessageUnInitRefArg -analyzer-output=text -verify %s
// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.NewDelete,core,alpha.core.CallAndMessageUnInitRefArg -analyzer-output=text -DTEST_INLINABLE_ALLOCATORS -verify %s
// Passing uninitialized const data to unknown function

#include "Inputs/system-header-simulator-cxx.h"

void doStuff6(const int& c);
void doStuff4(const int y);
void doStuff3(int& g);
void doStuff_uninit(const int *u);


int f10(void) {
  int *ptr;

  ptr = new int; //
  if(*ptr) {
    doStuff4(*ptr);
  }
  delete ptr;
  return 0;
}

int f9(void) {
  int *ptr;

  ptr = new int; //

  doStuff_uninit(ptr); // no warning
  delete ptr;
  return 0;
}

int f8(void) {
  int *ptr;

  ptr = new int;
  *ptr = 25;

  doStuff_uninit(ptr); // no warning?
  delete ptr;
  return 0;
}

void f7(void) {
  int m = 3;
  doStuff6(m); // no warning
}


int& f6_1_sub(int &p) {
  return p; // expected-note{{Returning without writing to 'p'}}
            // expected-note@-1{{Returning pointer (reference to 't')}}
}

void f6_1(void) {
  int t; // expected-note{{'t' declared without an initial value}}
  int p = f6_1_sub(t); //expected-warning {{Assigned value is garbage or undefined}}
                       //expected-note@-1 {{Passing value via 1st parameter 'p'}}
                       //expected-note@-2 {{Calling 'f6_1_sub'}}
                       //expected-note@-3 {{Returning from 'f6_1_sub'}}
                       //expected-note@-4 {{Assigned value is garbage or undefined}}
  int q = p;
  doStuff6(q);
}

void f6_2(void) {
  int t;       //expected-note {{'t' declared without an initial value}}
  int &p = t;  //expected-note {{'p' initialized here}}
  int &s = p;  //expected-note {{'s' initialized here}}
  int &q = s;  //expected-note {{'q' initialized here}}
  doStuff6(q); //expected-warning {{1st function call argument is an uninitialized value}}
               //expected-note@-1 {{1st function call argument is an uninitialized value}}
}

void doStuff6_3(int& q_, int *ptr_) {}

void f6_3(void) {
  int *ptr;    //expected-note {{'ptr' declared without an initial value}}
  int t;
  int &p = t;
  int &s = p;
  int &q = s;
  doStuff6_3(q,ptr); //expected-warning {{2nd function call argument is an uninitialized value}}
               //expected-note@-1 {{2nd function call argument is an uninitialized value}}

}

void f6(void) {
  int k;       // expected-note {{'k' declared without an initial value}}
  doStuff6(k); // expected-warning {{1st function call argument is an uninitialized value}}
               // expected-note@-1 {{1st function call argument is an uninitialized value}}

}



void f5(void) {
  int t;               // expected-note {{'t' declared without an initial value}}
  int* tp = &t;        // expected-note {{'tp' initialized here}}
  doStuff_uninit(tp);  // expected-warning {{1st function call argument is a pointer to uninitialized value}}
                       // expected-note@-1 {{1st function call argument is a pointer to uninitialized value}}
}


void f4(void) {
      int y;        // expected-note {{'y' declared without an initial value}}
      doStuff4(y);  // expected-warning {{1st function call argument is an uninitialized value}}
                    // expected-note@-1 {{1st function call argument is an uninitialized value}}
}

void f3(void) {
      int g;
      doStuff3(g); // no warning
}

int z;
void f2(void) {
      doStuff_uninit(&z);  // no warning
}

void f1(void) {
      int x_=5;
      doStuff_uninit(&x_);  // no warning
}

void f_uninit(void) {
      int x;               // expected-note {{'x' declared without an initial value}}
      doStuff_uninit(&x);  // expected-warning {{1st function call argument is a pointer to uninitialized value}}
                           // expected-note@-1 {{1st function call argument is a pointer to uninitialized value}}
}