It tells the compiler the function will either return NULL or an allocation of the size specific by the parameter referenced by alloc_size. It could also be used for functions resembling allocation functions which aren't actually allocating. The compiler will use it for optimization so it's extremely important that it's only used correctly. It only really has a use on the top-level API used externally. The compiler uses it for __builtin_object_size which is primarily used by FORTIFY_SOURCE and also internally by -fsanitize=object-size which will be available for the kernel via UBSan to find bugs or as hardening in the trapping mode. There are currently compatibility issues (undefined out-of-bounds accesses) blocking using -fsanitize=object-size beyond fixing those relatively benign issues to allow using it elsewhere. For example, it will know that kmalloc(n) returns either NULL or an allocation of size n. A simple sample program with calloc in userspace: #include <stdlib.h> #include <stdio.h> int main(void) { char *p = calloc(64, 1); if (!p) { return 1; } printf("%zu\n", __builtin_object_size(p, 1)); return 0; } It will also detect an out-of-bounds access via the allocation with -fsanitize=object-size including with a runtime value as the index. It's not as useful as it should be yet because __builtin_object_size must return a compile-time constant. Clang has a new __builtin_dynamic_object_size that's allowed to return a value that's not a compile-time constant so it can work for kmalloc(n) where n is a runtime value. It might not be quite ready for use yet but it should be able to make it a lot more useful. GCC also seems open to adding it too.