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