This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
remove most 'a' flags from embed.fnc
authorDavid Mitchell <davem@iabyn.com>
Thu, 4 Aug 2016 10:47:02 +0000 (11:47 +0100)
committerDavid Mitchell <davem@iabyn.com>
Thu, 4 Aug 2016 10:47:02 +0000 (11:47 +0100)
commit346c6a2954c23fb46d892160e65f9ea2d7d4a4fd
treef4ab41ab70c283be3a5d8e67dd6b6ae05439f5d3
parent88e4ff8c2b6ddfa921d30822801fbcbc2ace9e4c
remove most 'a' flags from embed.fnc

From: http://nntp.perl.org/group/perl.perl5.porters/237910:

In embed.fnc, we mark about 80 functions with the a flag, which we
document as meaning:

:   a  Allocates memory a la malloc/calloc.  Also implies "R":
:
:         proto.h: add __attribute__malloc__

Now, the current gcc docs for the malloc attribute states:

    This tells the compiler that a function is malloc-like, i.e., that the
    pointer P returned by the function cannot alias any other pointer
    valid when the function returns, and moreover no pointers to valid
    objects occur in any storage addressed by P.

    Using this attribute can improve optimization. Functions like malloc
    and calloc have this property because they return a pointer to
    uninitialized or zeroed-out storage. However, functions like realloc
    do not have this property, as they can return a pointer to storage
    containing pointers.

This implies to me that we should only flag functions as 'a' if both:

    1) it returns a pointer to memory that isn't pointed to from elsewhere;
    2) that the block of memory itself contains no pointers.

I think we are failing condition (2) for many 'a' functions; for example
the op.c newXXXOP() functions return an alloced op struct (condition 1
probably satisfied), but which contain pointers (condition 2 fails).
embed.fnc
proto.h