If the size of the object is not known or it has side effects the
__builtin_object_size() function returns:
(size_t)-1
for type 0 and 1.
(size_t)0
for type 2 and 3.
If the size of the object is known, then the
__builtin_object_size() function returns the maximum size of all the objects that the compiler knows that they can be pointed to by
ptr when
type & 2 == 0, and the minimum size when
type & 2 != 0.