forked from OSchip/llvm-project
129 lines
3.2 KiB
C++
129 lines
3.2 KiB
C++
// RUN: %clang_cc1 -analyze -analyzer-checker=cplusplus.NewDelete,core,alpha.core.CallAndMessageUnInitRefArg -analyzer-output=text -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;
|
|
}
|
|
|
|
void f6_1(void) {
|
|
int t;
|
|
int p = f6_1_sub(t); //expected-warning {{Assigned value is garbage or undefined}}
|
|
//expected-note@-1 {{Calling 'f6_1_sub'}}
|
|
//expected-note@-2 {{Returning from 'f6_1_sub'}}
|
|
//expected-note@-3 {{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;
|
|
int &s = p;
|
|
int &q = s; //expected-note {{'q' initialized here}}
|
|
doStuff6(q); //expected-warning {{Function call argument is an uninitialized value}}
|
|
//expected-note@-1 {{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 {{Function call argument is an uninitialized value}}
|
|
//expected-note@-1 {{Function call argument is an uninitialized value}}
|
|
|
|
}
|
|
|
|
void f6(void) {
|
|
int k; // expected-note {{'k' declared without an initial value}}
|
|
doStuff6(k); // expected-warning {{Function call argument is an uninitialized value}}
|
|
// expected-note@-1 {{Function call argument is an uninitialized value}}
|
|
|
|
}
|
|
|
|
|
|
|
|
void f5(void) {
|
|
int t;
|
|
int* tp = &t; // expected-note {{'tp' initialized here}}
|
|
doStuff_uninit(tp); // expected-warning {{Function call argument is a pointer to uninitialized value}}
|
|
// expected-note@-1 {{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 {{Function call argument is an uninitialized value}}
|
|
// expected-note@-1 {{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;
|
|
doStuff_uninit(&x); // expected-warning {{Function call argument is a pointer to uninitialized value}}
|
|
// expected-note@-1 {{Function call argument is a pointer to uninitialized value}}
|
|
}
|