Closed
Description
Using __builtin_object_size(p, 1)
in within an inline acts like mode 0 instead of mode 1.
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#define show(expr) printf("%s: %zu\n", #expr, expr)
struct object {
int a;
char buf[7];
int c;
};
static inline void func_inline(const char *ptr)
{
puts("func_inline");
show(__builtin_object_size(ptr, 0));
show(__builtin_object_size(ptr, 1));
}
void __attribute__ ((noinline)) func(const char *ptr)
{
puts("func");
show(__builtin_object_size(ptr, 0));
show(__builtin_object_size(ptr, 1));
}
int main(void)
{
struct object instance;
puts("main");
show(__builtin_object_size(instance.buf, 0));
show(__builtin_object_size(instance.buf, 1));
func_inline(instance.buf);
func(instance.buf);
return 0;
}
GCC:
main
__builtin_object_size(instance.buf, 0): 12
__builtin_object_size(instance.buf, 1): 7
func_inline
__builtin_object_size(ptr, 0): 12
__builtin_object_size(ptr, 1): 7
func
__builtin_object_size(ptr, 0): 18446744073709551615
__builtin_object_size(ptr, 1): 18446744073709551615
Clang:
main
__builtin_object_size(instance.buf, 0): 12
__builtin_object_size(instance.buf, 1): 7
func_inline
__builtin_object_size(ptr, 0): 12
__builtin_object_size(ptr, 1): 12
func
__builtin_object_size(ptr, 0): 18446744073709551615
__builtin_object_size(ptr, 1): 18446744073709551615