15188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=unix.API,osx.API %s -analyzer-store=region -fblocks -verify
299d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek
399d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenekstruct _opaque_pthread_once_t {
499d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  long __sig;
599d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  char __opaque[8];
699d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek};
799d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenektypedef struct _opaque_pthread_once_t    __darwin_pthread_once_t;
899d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenektypedef __darwin_pthread_once_t pthread_once_t;
999d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenekint pthread_once(pthread_once_t *, void (*)(void));
10b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenektypedef long unsigned int __darwin_size_t;
11b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenektypedef __darwin_size_t size_t;
12c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenekvoid *calloc(size_t, size_t);
13b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenekvoid *malloc(size_t);
14c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenekvoid *realloc(void *, size_t);
153e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenekvoid *alloca(size_t);
163e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenekvoid *valloc(size_t);
1799d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek
1899d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenektypedef void (^dispatch_block_t)(void);
1999d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenektypedef long dispatch_once_t;
2099d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenekvoid dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);
21381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek
22fc89323210a5f3f53808f7d801705d6b8c0a4224Ted Kremenek#ifndef O_CREAT
23fc89323210a5f3f53808f7d801705d6b8c0a4224Ted Kremenek#define O_CREAT 0x0200
24fc89323210a5f3f53808f7d801705d6b8c0a4224Ted Kremenek#define O_RDONLY 0x0000
25fc89323210a5f3f53808f7d801705d6b8c0a4224Ted Kremenek#endif
26fc89323210a5f3f53808f7d801705d6b8c0a4224Ted Kremenekint open(const char *, int, ...);
2799d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenekint close(int fildes);
28381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek
29381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenekvoid test_open(const char *path) {
30381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek  int fd;
31381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek  fd = open(path, O_RDONLY); // no-warning
32381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek  if (!fd)
33381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek    close(fd);
34381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek
35381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek  fd = open(path, O_CREAT); // expected-warning{{Call to 'open' requires a third argument when the 'O_CREAT' flag is set}}
36381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek  if (!fd)
37381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek    close(fd);
38381d1bf0eeabccac1ba64909cad73d2ee963897bTed Kremenek}
3999d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek
4099d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenekvoid test_dispatch_once() {
4199d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  dispatch_once_t pred = 0;
4299d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  do { if (__builtin_expect(*(&pred), ~0l) != ~0l) dispatch_once((&pred), (^() {})); } while (0); // expected-warning{{Call to 'dispatch_once' uses the local variable 'pred' for the predicate value}}
4399d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek}
4499d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenekvoid test_dispatch_once_neg() {
4599d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  static dispatch_once_t pred = 0;
4699d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  do { if (__builtin_expect(*(&pred), ~0l) != ~0l) dispatch_once((&pred), (^() {})); } while (0); // no-warning
4799d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek}
4899d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek
4999d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenekvoid test_pthread_once_aux();
5099d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek
5199d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenekvoid test_pthread_once() {
5299d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  pthread_once_t pred = {0x30B1BCBA, {0}};
5399d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  pthread_once(&pred, test_pthread_once_aux); // expected-warning{{Call to 'pthread_once' uses the local variable 'pred' for the "control" value}}
5499d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek}
5599d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenekvoid test_pthread_once_neg() {
5699d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  static pthread_once_t pred = {0x30B1BCBA, {0}};
5799d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek  pthread_once(&pred, test_pthread_once_aux); // no-warning
5899d9838b256ded8e59f85c93647ba5ec060b7145Ted Kremenek}
59b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek
60b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek// PR 2899 - warn of zero-sized allocations to malloc().
61b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenekvoid pr2899() {
62b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek  char* foo = malloc(0); // expected-warning{{Call to 'malloc' has an allocation size of 0 bytes}}
63b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek  for (unsigned i = 0; i < 100; i++) {
64b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek    foo[i] = 0;
65b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek  }
66b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek}
67b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenekvoid pr2899_nowarn(size_t size) {
68b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek  char* foo = malloc(size); // no-warning
69b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek  for (unsigned i = 0; i < 100; i++) {
70b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek    foo[i] = 0;
71b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek  }
72b12fbc216f77bd309f8c416834b341ff43325aabTed Kremenek}
73c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenekvoid test_calloc(void) {
74c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  char *foo = calloc(0, 42); // expected-warning{{Call to 'calloc' has an allocation size of 0 bytes}}
75c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  for (unsigned i = 0; i < 100; i++) {
76c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek    foo[i] = 0;
77c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  }
78c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek}
79c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenekvoid test_calloc2(void) {
80c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  char *foo = calloc(42, 0); // expected-warning{{Call to 'calloc' has an allocation size of 0 bytes}}
81c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  for (unsigned i = 0; i < 100; i++) {
82c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek    foo[i] = 0;
83c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  }
84c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek}
85c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenekvoid test_calloc_nowarn(size_t nmemb, size_t size) {
86c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  char *foo = calloc(nmemb, size); // no-warning
87c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  for (unsigned i = 0; i < 100; i++) {
88c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek    foo[i] = 0;
89c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  }
90c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek}
91c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenekvoid test_realloc(char *ptr) {
92c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  char *foo = realloc(ptr, 0); // expected-warning{{Call to 'realloc' has an allocation size of 0 bytes}}
93c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  for (unsigned i = 0; i < 100; i++) {
94c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek    foo[i] = 0;
95c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  }
96c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek}
97c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenekvoid test_realloc_nowarn(char *ptr, size_t size) {
98c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  char *foo = realloc(ptr, size); // no-warning
99c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  for (unsigned i = 0; i < 100; i++) {
100c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek    foo[i] = 0;
101c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek  }
102c1275da4eb5778eb3c9600e79918ad1fbec589c6Ted Kremenek}
1033e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenekvoid test_alloca() {
1043e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  char *foo = alloca(0); // expected-warning{{Call to 'alloca' has an allocation size of 0 bytes}}
1053e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  for(unsigned i = 0; i < 100; i++) {
1063e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek    foo[i] = 0;
1073e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  }
1083e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek}
1093e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenekvoid test_alloca_nowarn(size_t sz) {
1103e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  char *foo = alloca(sz); // no-warning
1113e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  for(unsigned i = 0; i < 100; i++) {
1123e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek    foo[i] = 0;
1133e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  }
1143e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek}
1153e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenekvoid test_builtin_alloca() {
1163e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  char *foo2 = __builtin_alloca(0); // expected-warning{{Call to 'alloca' has an allocation size of 0 bytes}}
1173e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  for(unsigned i = 0; i < 100; i++) {
1183e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek    foo2[i] = 0;
1193e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  }
1203e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek}
1213e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenekvoid test_builtin_alloca_nowarn(size_t sz) {
1223e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  char *foo2 = __builtin_alloca(sz); // no-warning
1233e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  for(unsigned i = 0; i < 100; i++) {
1243e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek    foo2[i] = 0;
1253e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  }
1263e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek}
1273e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenekvoid test_valloc() {
1283e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  char *foo = valloc(0); // expected-warning{{Call to 'valloc' has an allocation size of 0 bytes}}
1293e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  for(unsigned i = 0; i < 100; i++) {
1303e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek    foo[i] = 0;
1313e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  }
1323e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek}
1333e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenekvoid test_valloc_nowarn(size_t sz) {
1343e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  char *foo = valloc(sz); // no-warning
1353e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  for(unsigned i = 0; i < 100; i++) {
1363e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek    foo[i] = 0;
1373e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek  }
1383e97758f22f31d0dbc336fc4794b86aed8607053Ted Kremenek}
139