Skip to content

__builtin_object_size(p, 1) misbehaves when inlined #53516

Closed
@kees

Description

@kees

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    wontfixIssue is real, but we can't or won't fix it. Not invalid

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions