Bug 104934 - -fsanitize=undefined codegen err
Summary: -fsanitize=undefined codegen err
Status: RESOLVED INVALID
Alias: None
Product: gcc
Classification: Unclassified
Component: sanitizer (show other bugs)
Version: 12.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-03-15 11:53 UTC by Dmitry G. Dyachenko
Modified: 2022-03-15 16:18 UTC (History)
5 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Dmitry G. Dyachenko 2022-03-15 11:53:25 UTC
r12-7608 FAIL

Probably FAIL long ago: gcc-8 FAIL
gcc version 8.0.1 20180125 (experimental) [trunk revision 257061] (GCC)


$ g++ -fsanitize=undefined -c -o x.o x.ii && nm -u --reverse-sort x.o
                 U _ZTI1S
$ g++ -c -o x.o x.ii && nm -u --reverse-sort x.o

$ cat x.ii
struct a {};
struct b {
  a c;
};
struct S : a {
  virtual int d();
};
struct e : b {
  unsigned f();
};
unsigned e::f() { static_cast<S *>(&c); return 0; }

$ ~/arch-gcc/gcc_current/bin/g++ -v
Using built-in specs.
COLLECT_GCC=/home/dimhen/arch-gcc/gcc_current/bin/g++
COLLECT_LTO_WRAPPER=/home/dimhen/arch-gcc/gcc_current/libexec/gcc/x86_64-pc-linux-gnu/12.0.1/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
Target: x86_64-pc-linux-gnu
Configured with: /home/dimhen/src/gcc_current/configure --prefix=/home/dimhen/arch-gcc/gcc_current --enable-checking=yes,df,fold,rtl,extra --enable-languages=c,c++,lto --disable-multilib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=native --enable-libstdcxx-debug
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.0.1 20220311 (experimental) [master r12-7608-g5e28be89665] (GCC)
Comment 1 Jakub Jelinek 2022-03-15 13:32:25 UTC
And the bug is?
The S class doesn't have the key method defined, so some other TU needs to define it and thus provide the vtable and rtti for it.
Without -fsanitize=vptr the typeinfo isn't needed on this particular testcase and the vtable isn't needed either, which is why you don't get an undefined symbol in that case and you get it with -fsanitize=vptr or -fsanitize=undefined that implies that.
Comment 2 Dmitry G. Dyachenko 2022-03-15 16:14:02 UTC
(In reply to Jakub Jelinek from comment #1)
> And the bug is?
> The S class doesn't have the key method defined, so some other TU needs to
> define it and thus provide the vtable and rtti for it.
> Without -fsanitize=vptr the typeinfo isn't needed on this particular
> testcase and the vtable isn't needed either, which is why you don't get an
> undefined symbol in that case and you get it with -fsanitize=vptr or
> -fsanitize=undefined that implies that.

Thank you, Jakub.
So, close as 'INVALID'?
Comment 3 Jakub Jelinek 2022-03-15 16:18:22 UTC
.