diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2025-09-02 15:58:26 -0700 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2025-09-02 15:58:26 -0700 |
commit | 071b4126c613881f4cb25b4e5c39032964827f88 (patch) | |
tree | 7ed805786566918630d1d617b1ed8f7310f5fd8e /gcc/testsuite/gcc.dg/pr120929.c | |
parent | 845d23f3ea08ba873197c275a8857eee7edad996 (diff) | |
parent | caa1c2f42691d68af4d894a5c3e700ecd2dba080 (diff) | |
download | gcc-devel/gfortran-test.zip gcc-devel/gfortran-test.tar.gz gcc-devel/gfortran-test.tar.bz2 |
Merge branch 'master' into gfortran-testdevel/gfortran-test
Diffstat (limited to 'gcc/testsuite/gcc.dg/pr120929.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr120929.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr120929.c b/gcc/testsuite/gcc.dg/pr120929.c new file mode 100644 index 0000000..8bb6d5c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr120929.c @@ -0,0 +1,49 @@ +/* PR120929, pointee's size should not be propagated to pointer for + __builtin_dynamic_object_size. */ + +/* { dg-do compile} */ +/* { dg-options "-O2" } */ + +typedef __SIZE_TYPE__ size_t; + +extern void pin_pointer(void *); +extern int some_value(void); + +struct magic_ { + char unused[9]; // at least 9 +}; + +struct magic_map { + struct magic_ *magic; +}; + +static int +coalesce_entries(struct magic_ **ma) +{ + size_t slen; + + slen = sizeof (**ma); + *ma = __builtin_malloc (slen); + + for (unsigned i = 0; i < 1; i++) + { + char b[1024] = {}; + struct magic_ *ptr = *ma; + (void) __builtin___memcpy_chk (ptr, b, sizeof (*ptr), /* { dg-bogus "overflows the destination" } */ + __builtin_dynamic_object_size (ptr, 0)); + } + return 0; +} + +struct magic_map * +apprentice_load(void) +{ + char buf[128]; // did not shrink, but needs to be more than 100 + struct magic_map *map2; + + map2 = __builtin_malloc (sizeof (*map2)); + + pin_pointer(&buf); + coalesce_entries(&map2->magic); + pin_pointer(map2); +} |