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