https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81798

            Bug ID: 81798
           Summary: Please introduce new attribute to tell that function
                    zeroes returned memory
           Product: gcc
           Version: 7.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bugzi...@poradnik-webmastera.com
  Target Milestone: ---

gcc is able to detect case when memory is allocated using calloc and then
zeroed out again using memset - in such case it removes this extra memset.
However it cannot do the same with custom calloc-like functions. Please
introduce new function attribute for this, or allow to pass argument to
existing malloc attribute.

Note: this attribute probably could be useful with other functions too, so it
should have more general name.

Code:

#include <string.h>
#include <stdlib.h>

void* test()
{
    void* p = calloc(10240, 1);
    memset(p, 0, 10240);
    return p;
}

__attribute__((malloc, alloc_size(1)))
void* mycalloc(size_t size);

void* test2()
{
    void* p = mycalloc(10240);
    memset(p, 0, 10240);
    return p;
}

Result:

test():
  mov esi, 1
  mov edi, 10240
  jmp calloc
test2():
  sub rsp, 8
  mov edi, 10240
  call mycalloc(unsigned long)
  mov edx, 10240
  xor esi, esi
  mov rdi, rax
  call memset
  add rsp, 8
  ret

Reply via email to