Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 20 Jan 2018 15:59:38 -0800
From:      Mark Millard <marklmi26-fbsd@yahoo.com>
To:        Pedro Giffuni <pfg@FreeBSD.org>, FreeBSD Toolchain <freebsd-toolchain@freebsd.org>, FreeBSD Hackers <freebsd-hackers@freebsd.org>
Subject:   Re: Attribute alloc__size use and clang 5.0.1 vs. gcc7 (e.g.): __builtin_object_size(p,1) and __builtin_object_size(p,3) disagreements result
Message-ID:  <F227842D-6BE2-4680-82E7-07906AF61CD7@yahoo.com>
In-Reply-To: <1AA0993D-81E4-4DC0-BBD9-CC42B26ADB1C@yahoo.com>
References:  <1AA0993D-81E4-4DC0-BBD9-CC42B26ADB1C@yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
[Noting a typo in the program source, and
so in the output text: the 2nd occurance of: "my_calloc_alt0
should have been: "my_calloc_alt1
. Hand edited corrections below for clarity.]

On 2018-Jan-20, at 3:27 PM, Mark Millard <marklmi26-fbsd@yahoo.com> =
wrote:

> [Bugzilla 225197 indirectly lead to this.
> Avoiding continuing there.]
>=20
> I decided to compare some alternate uses of
> __attribute__((alloc_size(. . .))) compiled
> and run under clang 5.0.1 and gcc7. I did not
> get what I expected based on prior discussion
> material.
>=20
> This is an FYI since I do not know how important
> the distinctions that I found are.
>=20
> Here is the quick program:
>=20
> # more alloc_size_attr_test.c=20
> #include <stdlib.h>
> #include <stdio.h>
>=20
> __attribute__((alloc_size(1,2)))
> void* my_calloc_alt0(size_t n, size_t s)
> {
>   void* p =3D calloc(n,s);
>   printf("calloc __builtin_object_size 0,1,2,3: %ld, %ld, %ld, %ld\n"
>         ,(long) __builtin_object_size(p, 0)
>         ,(long) __builtin_object_size(p, 1)
>         ,(long) __builtin_object_size(p, 2)
>         ,(long) __builtin_object_size(p, 3)
>         );
>   return p;
> }
>=20
> __attribute__((alloc_size(1))) __attribute__((alloc_size(2)))
> void* my_calloc_alt1(size_t n, size_t s)
> {
>   void* p =3D calloc(n,s);
>   printf("calloc __builtin_object_size 0,1,2,3: %ld, %ld, %ld, %ld\n"
>         ,(long) __builtin_object_size(p, 0)
>         ,(long) __builtin_object_size(p, 1)
>         ,(long) __builtin_object_size(p, 2)
>         ,(long) __builtin_object_size(p, 3)
>         );
>   return p;
> }
>=20
> int main()
> {
>   void* p =3D my_calloc_alt0(2,7);
>   printf("my_calloc_alt0 __builtin_object_size 0,1,2,3: %ld, %ld, %ld, =
%ld\n"
>         ,(long) __builtin_object_size(p, 0)
>         ,(long) __builtin_object_size(p, 1)
>         ,(long) __builtin_object_size(p, 2)
>         ,(long) __builtin_object_size(p, 3)
>         );
>   void* q =3D my_calloc_alt1(2,7);
>   printf("my_calloc_alt0 __builtin_object_size 0,1,2,3: %ld, %ld, %ld, =
%ld\n"

The above line should have been:

printf("my_calloc_alt1 __builtin_object_size 0,1,2,3: %ld, %ld, %ld, =
%ld\n"

>         ,(long) __builtin_object_size(q, 0)
>         ,(long) __builtin_object_size(q, 1)
>         ,(long) __builtin_object_size(q, 2)
>         ,(long) __builtin_object_size(q, 3)
>         );
> }
>=20
> # uname -apKU
> FreeBSD FBSDFSSD 12.0-CURRENT FreeBSD 12.0-CURRENT  r327485M  amd64 =
amd64 1200054 1200054
>=20
> The system-clang 5.0.1 result was:
>=20
> # clang -O2 alloc_size_attr_test.c

The later outputs are edited for clarity:

> # ./a.out
> calloc __builtin_object_size 0,1,2,3: 14, 14, 14, 0
> my_calloc_alt0 __builtin_object_size 0,1,2,3: 14, 14, 14, 0
> calloc __builtin_object_size 0,1,2,3: 14, 14, 14, 0
my_calloc_alt1 __builtin_object_size 0,1,2,3: 14, 14, 14, 0
>=20
> The lang/gcc7 result was:
>=20
> # gcc7 -O2 alloc_size_attr_test.c
>=20
> # ./a.out
> calloc __builtin_object_size 0,1,2,3: -1, -1, 0, 0
> my_calloc_alt0 __builtin_object_size 0,1,2,3: 14, 14, 14, 14
> calloc __builtin_object_size 0,1,2,3: -1, -1, 0, 0
my_calloc_alt1 __builtin_object_size 0,1,2,3: 14, 7, 14, 14
>=20
> I'll ignore that gcc does not provide actual sizes
> via __builtin_object_size for calloc use.
>=20
> Pairing the other lines for easy comparison, with
> some notes mixed in:
>=20
> __attribute__((alloc_size(1,2))) style:
> my_calloc_alt0 __builtin_object_size 0,1,2,3: 14, 14, 14, 0  (system =
clang)
> my_calloc_alt0 __builtin_object_size 0,1,2,3: 14, 14, 14, 14 (gcc7)
>=20
> __attribute__((alloc_size(1))) __attribute__((alloc_size(2))) style:
my_calloc_alt1 __builtin_object_size 0,1,2,3: 14, 14, 14, 0  (system =
clang)
my_calloc_alt1 __builtin_object_size 0,1,2,3: 14, 7, 14, 14  (gcc7)
>=20
> Thus. . .
>=20
> For __attribute__((alloc_size(1))) __attribute__((alloc_size(2))):
> __builtin_object_size(p,1) is not equivalent (clang vs. gcc7)
>=20
> For both of the alloc_size usage styles:
> __builtin_object_size(p,3) is not equivalent (clang vs. gcc7)
>=20
> This means that the two style of alloc_size use are not
> equivalent across some major compilers/toolchains.
>=20
> But I do not know if either of the differences is a problem or
> not.
>=20
>=20
> Note: without a sufficient -O<?> all the figures can be
> the mix of -1's and 0's.


=3D=3D=3D
Mark Millard
marklmi at yahoo.com
( markmi at dsl-only.net is
going away in 2018-Feb, late)




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?F227842D-6BE2-4680-82E7-07906AF61CD7>