malloc.cpp revision f132ba8e571298ceda306c4484e031f990b347da
14b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.deadcode.UnreachableCode,experimental.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 94b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks// Test for radar://11110132. 104b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaksstruct Foo { 114b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks mutable void* m_data; 124b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks Foo(void* data) : m_data(data) {} 134b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks}; 144b81e742c8d23600e4244d69f20322e3535e3d86Anna ZaksFoo aFunction() { 154b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks return malloc(10); 164b81e742c8d23600e4244d69f20322e3535e3d86Anna Zaks} 17aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks 18aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks// Assume that functions which take a function pointer can free memory even if 19aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks// they are defined in system headers and take the const pointer to the 20aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks// allocated memory. (radar://11160612) 21aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks// Test default parameter. 22aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaksint const_ptr_and_callback_def_param(int, const char*, int n, void(*)(void*) = 0); 23aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaksvoid r11160612_3() { 24aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks char *x = (char*)malloc(12); 25aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks const_ptr_and_callback_def_param(0, x, 12); 26aca0ac58d2ae80d764e3832456667d7322445e0cAnna Zaks} 27f132ba8e571298ceda306c4484e031f990b347daAnna Zaks 28f132ba8e571298ceda306c4484e031f990b347daAnna Zaks// Test member function pointer. 29f132ba8e571298ceda306c4484e031f990b347daAnna Zaksstruct CanFreeMemory { 30f132ba8e571298ceda306c4484e031f990b347daAnna Zaks static void myFree(void*); 31f132ba8e571298ceda306c4484e031f990b347daAnna Zaks}; 32f132ba8e571298ceda306c4484e031f990b347daAnna Zaks//This is handled because we look at the type of the parameter(not argument). 33f132ba8e571298ceda306c4484e031f990b347daAnna Zaksvoid r11160612_3(CanFreeMemory* p) { 34f132ba8e571298ceda306c4484e031f990b347daAnna Zaks char *x = (char*)malloc(12); 35f132ba8e571298ceda306c4484e031f990b347daAnna Zaks const_ptr_and_callback_def_param(0, x, 12, p->myFree); 36f132ba8e571298ceda306c4484e031f990b347daAnna Zaks} 37f132ba8e571298ceda306c4484e031f990b347daAnna Zaks 38