1cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc -analyzer-store=region -verify %s 24b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks 34b81e742c8d23600e4244d69f20322e3535e3d86Anna Zakstypedef __typeof(sizeof(int)) size_t; 44b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaksvoid *malloc(size_t); 54b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaksvoid free(void *); 64b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaksvoid *realloc(void *ptr, size_t size); 74b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaksvoid *calloc(size_t nmemb, size_t size); 84b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks 95a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose 105a1ffe98b04120846a15f7105905b5f363b08635Jordan Rosevoid checkThatMallocCheckerIsRunning() { 115a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose malloc(4); // expected-warning{{leak}} 125a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose} 135a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose 144b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks// Test for radar://11110132. 154b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaksstruct Foo { 164b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks mutable void* m_data; 174b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks Foo(void* data) : m_data(data) {} 184b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks}; 194b81e742c8d23600e4244d69f20322e3535e3d86Anna ZaksFoo aFunction() { 204b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks return malloc(10); 214b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks} 22aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks 23aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks// Assume that functions which take a function pointer can free memory even if 24aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks// they are defined in system headers and take the const pointer to the 25aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks// allocated memory. (radar://11160612) 26aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks// Test default parameter. 27aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaksint const_ptr_and_callback_def_param(int, const char*, int n, void(*)(void*) = 0); 28aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaksvoid r11160612_3() { 29aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks char *x = (char*)malloc(12); 30aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks const_ptr_and_callback_def_param(0, x, 12); 31aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks} 32f132ba8e571298ceda306c4484e031f990b347daAnna Zaks 33f132ba8e571298ceda306c4484e031f990b347daAnna Zaks// Test member function pointer. 34f132ba8e571298ceda306c4484e031f990b347daAnna Zaksstruct CanFreeMemory { 35f132ba8e571298ceda306c4484e031f990b347daAnna Zaks static void myFree(void*); 36f132ba8e571298ceda306c4484e031f990b347daAnna Zaks}; 37f132ba8e571298ceda306c4484e031f990b347daAnna Zaks//This is handled because we look at the type of the parameter(not argument). 38f132ba8e571298ceda306c4484e031f990b347daAnna Zaksvoid r11160612_3(CanFreeMemory* p) { 39f132ba8e571298ceda306c4484e031f990b347daAnna Zaks char *x = (char*)malloc(12); 40f132ba8e571298ceda306c4484e031f990b347daAnna Zaks const_ptr_and_callback_def_param(0, x, 12, p->myFree); 41f132ba8e571298ceda306c4484e031f990b347daAnna Zaks} 42f132ba8e571298ceda306c4484e031f990b347daAnna Zaks 435a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose 445a1ffe98b04120846a15f7105905b5f363b08635Jordan Rosenamespace PR13751 { 455a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose class OwningVector { 465a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose void **storage; 475a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose size_t length; 485a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose public: 495a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose OwningVector(); 505a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose ~OwningVector(); 515a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose void push_back(void *Item) { 525a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose storage[length++] = Item; 535a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose } 545a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose }; 555a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose 565a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose void testDestructors() { 575a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose OwningVector v; 585a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose v.push_back(malloc(4)); 595a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose // no leak warning; freed in destructor 605a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose } 615a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose} 625a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose 63