You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The "malloc" attribute restricts the possible function signatures to
the ones returning a pointer, which is not the case for some non-standard
allocation functions variants. For example, P0901R11 proposed ::operator new
overloads that return a return_size_t result - a struct that contains
a pointer to the allocated memory as well as the actual size of the
allocated memory. Another example is __size_returning_new.
Introduce a new "malloc_span" attribute that exhibits similar semantics,
but can be applied to the functions returning records whose first member is
a pointer (which would be assumed to point to the allocated memory).
This is the case for return_size_t as well as std::span, should it be
returned from such an annotated function.
An alternative approach would be to relax the restrictions for the
existing "malloc" attribute to be applied to both functions returning
pointers and functions returning span-like structs. However, it would
complicate the user-space code that would now need to check for the
specific Clang version while the presence of a new attribute is
straightforward to check via __has_attribute. Another concern would have
been the compatibility between "malloc" semantics between Clang and GCC,
which is not the case for a new separate "malloc_span" attribute.
In future commits, codegen can be improved to recognize the
noalias-ness of the pointer returned inside a span-like struct.
This change helps unlock the alloc token instrumentation for such
non-standard allocation functions:
https://clang.llvm.org/docs/AllocToken.html#instrumenting-non-standard-allocation-functions
// The first struct field must be pointer and the second must be an integer.
13
+
// Check the possible ways to violate it.
14
+
typedefstruct {
15
+
size_tn;
16
+
void*ptr;
17
+
} invalid_span1;
18
+
invalid_span1returns_non_std_span1 (void) __attribute((malloc_span)); // expected-warning {{attribute only applies to return values that are span-like structures}}
19
+
20
+
typedefstruct {
21
+
void*ptr;
22
+
void*ptr2;
23
+
} invalid_span2;
24
+
invalid_span2returns_non_std_span2 (void) __attribute((malloc_span)); // expected-warning {{attribute only applies to return values that are span-like structures}}
25
+
26
+
typedefstruct {
27
+
void*ptr;
28
+
size_tn;
29
+
size_tn2;
30
+
} invalid_span3;
31
+
invalid_span3returns_non_std_span3 (void) __attribute((malloc_span)); // expected-warning {{attribute only applies to return values that are span-like structures}}
0 commit comments