https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101061

--- Comment #3 from Alexander Grund <alexander.gr...@tu-dresden.de> ---
You are right, it actually seems to be the combination of those to, so -O2
-fno-strict-aliasing and -O2 -fno-tree-vrp both make it work.

The layout-compatible refers to the "common initial sequence" that is allowed
to be inspected for inactive union members, see the link.

I also tested GCC 8.5.0 but there it is not fixed. (BTW: I checked the Github
mirror which doesn't list 8.5.0) I'm aware that it is no longer supported but I
too think that it is a latent bug or maybe just outright unsupported/UB

> If you have ways to pinpoint the function where things go wrong then it might 
> be possible to spot a wrong transform there

In the provided source the bug happens in this 2 lines:
        auto it = uniq.emplace(Tin(i), j);
        idx_vec(i) = it.first->second;

Tin and idx_vec can be replaced by std::vector<tstring> and std::vector<int>
respectively and the bug still occurs. However there are quite some
abstractions especially in the first line including a conversion from their
custom string type to their custom string_view

I know it has got not main, because it is part of the tensorflow shared library
loaded into the Python process and run from there. I wasn't able to reduce this
further as mentioned as almost any change leads to this bug disappearing.

I see that the tree-vrp has had many string-related changes which may handle
their custom string better, see
https://github.com/tensorflow/tensorflow/blob/c405c59212c764485818fad8b34294c0b553e6fb/tensorflow/core/platform/ctstring_internal.h#L118-L121
However they are dangerously close to UB in many places, e.g.
https://github.com/tensorflow/tensorflow/blob/c405c59212c764485818fad8b34294c0b553e6fb/tensorflow/core/platform/ctstring_internal.h#L184-L186
(the code executed here) accesses an array of one union member and a variable
of another.

I'm also not sure if allocating a chunk of memory and in-place construction of
an union containing a const member is actually allowed.

I just want to know for sure, that either their code is non-compliant or there
is a bug in the compiler. I can do experiments with the source but lack the
knowledge to trace it through the compiler.

See also my issue in the TF repo:
https://github.com/tensorflow/tensorflow/issues/47179

Reply via email to