Bug #115735 Build fails due to ODR violations
Submitted: 1 Aug 6:09 Modified: 2 Aug 16:16
Reporter: Eli Schwartz Email Updates:
Status: Unsupported Impact on me:
None 
Category:MySQL Workbench Severity:S3 (Non-critical)
Version: OS:Any
Assigned to: CPU Architecture:Any

[1 Aug 6:09] Eli Schwartz
Description:
I tried to build with the following *FLAGS to optimize the build: `-flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing`

Note the -Werror=* flags are used to help detect cases where the compiler tries to optimize by assuming Undefined Behavior cannot exist in the source code -- if it does exist, ordinarily the code would be miscompiled, and this says to make the miscompilation a fatal error.

I got this error:
```
FAILED: library/sql.parser/source/libsqlparser.so.8.0.38 
: && /usr/bin/x86_64-pc-linux-gnu-g++ -fPIC -pipe -march=native -fstack-protector-all -O2 -fdiagnostics-color=always -frecord-gcc-switches -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wformat -Werror=format-security -std=c++11  -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0 -shared -Wl,-soname,libsqlparser.so.8.0.38 -o library/sql.parser/source/libsqlparser.so.8.0.38 library/sql.parser/source/CMakeFiles/sqlparser.dir/charset-def.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/charset.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-big5.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-bin.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-cp932.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-czech.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-eucjpms.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-euc_kr.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-extra.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-gb2312.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-gbk.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-latin1.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-mb.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-simple.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-sjis.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-tis620.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-uca.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-ucs2.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-ujis.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-utf8.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-win1250ch.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/int2str.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/myx_lex_helpers.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/myx_sql_tree_item.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/myx_statement_parser.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/myx_unicode_scanner.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/sql_parser_symbols.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_messnc.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_static.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_strtoll10.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_vsnprintf.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_lib.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/strmake.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/strnmov.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/strtod.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/strxmov.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/str_alloc.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/linux/myx_sql_parser.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/xml.cpp.o   && :
/var/tmp/portage/dev-db/mysql-workbench-8.0.38/work/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-czech.cpp:103:8: error: type ‘struct wordvalue’ violates the C++ One Definition Rule [-Werror=odr]
  103 | struct wordvalue
      |        ^
/var/tmp/portage/dev-db/mysql-workbench-8.0.38/work/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-win1250ch.cpp:406:8: note: a different type is defined in another translation unit
  406 | struct wordvalue {
      |        ^
/var/tmp/portage/dev-db/mysql-workbench-8.0.38/work/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-czech.cpp:105:24: note: the first difference of corresponding definitions is field ‘word’
  105 |           const char * word;
      |                        ^
/var/tmp/portage/dev-db/mysql-workbench-8.0.38/work/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-win1250ch.cpp:407:23: note: a field of same name but different type is defined in another translation unit
  407 |         const uchar * word;
      |                       ^
/var/tmp/portage/dev-db/mysql-workbench-8.0.38/work/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-czech.cpp:103:8: note: type ‘const char’ should match type ‘const uchar’
  103 | struct wordvalue
      |        ^
lto1: some warnings being treated as errors
lto-wrapper: fatal error: /usr/bin/x86_64-pc-linux-gnu-g++ returned 1 exit status
compilation terminated.
/usr/libexec/gcc/x86_64-pc-linux-gnu/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
ninja: build stopped: cannot make progress due to previous errors.
```

Previously reported downstream as well: https://bugs.gentoo.org/924671

How to repeat:
LTO (link-time optimization) is a massively global optimizing pass capable of preserving type information etc. into the linker stage, and perform whole-program optimization. In the process, it can also perform whole-program warning scans.

With the following in both CXXFLAGS and LDFLAGS:

```
-flto -Werror=odr
```

you can check for and detect ODR violations.

Suggested fix:
These structs look totally unrelated, so giving them unique names probably suffices.
[1 Aug 6:10] Eli Schwartz
Full build log of the compilation failure.

Attachment: build.log (text/x-log), 2.01 MiB.

[2 Aug 12:22] MySQL Verification Team
Hello Eli Schwartz,

Thank you for the report.
Please note that Gentoo Linux is not yet supported by MySQL Workbench.
https://www.mysql.com/support/supportedplatforms/workbench.html

Regards,
Ashwini Patil
[2 Aug 16:16] Eli Schwartz
Hi, please don't be petty and insulting. The ISO standard for C++ doesn't change because of the linux distro I used to detect the ISO C++ standards violation.

But as you wish, let's reproduce this on Ubuntu 22.04. It was quite hard to do by the way, because your INSTALL file contains incorrect instructions to install packages that no longer exist on Ubuntu, and misses a bunch as well. But I figured out the right packages to install, then fixed a failure to find unixodbc because debian doesn't include all the files in the package ??? so that cmake even succeeds at configuring, and here we are:

$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

$ g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0

$ CXXFLAGS="-flto=auto -Werror=odr -fdiagnostics-color=always" LDFLAGS="-flto=auto -Werror=odr"  cmake .. -DUSE_UNIXODBC=ON -GNinja -DWITH_ANTLR_JAR=$PWD/../../antlr-4.7.2-complete.jar

$ ninja library/sql.parser/source/libsqlparser.so.8.0.38
[41/41] Linking CXX shared library library/sql.parser/source/libsqlparser.so.8.0.38
FAILED: library/sql.parser/source/libsqlparser.so.8.0.38 
: && /usr/bin/c++ -fPIC -flto=auto -Werror=odr -fdiagnostics-color=always -O3 -DNDEBUG  -flto=auto -Werror=odr -shared -Wl,-soname,libsqlparser.so.8.0.38 -o library/sql.parser/source/libsqlparser.so.8.0.38 library/sql.parser/source/CMakeFiles/sqlparser.dir/charset-def.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/charset.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-big5.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-bin.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-cp932.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-czech.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-eucjpms.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-euc_kr.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-extra.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-gb2312.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-gbk.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-latin1.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-mb.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-simple.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-sjis.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-tis620.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-uca.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-ucs2.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-ujis.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-utf8.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype-win1250ch.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/ctype.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/int2str.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/myx_lex_helpers.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/myx_sql_tree_item.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/myx_statement_parser.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/myx_unicode_scanner.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/sql_parser_symbols.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_messnc.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_static.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_strtoll10.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_vsnprintf.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/my_lib.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/strmake.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/strnmov.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/strtod.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/strxmov.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/str_alloc.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/linux/myx_sql_parser.cpp.o library/sql.parser/source/CMakeFiles/sqlparser.dir/xml.cpp.o   && :
/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-czech.cpp:103:8: error: type 'struct wordvalue' violates the C++ One Definition Rule [-Werror=odr]
  103 | struct wordvalue
      |        ^
/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-win1250ch.cpp:406:8: note: a different type is defined in another translation unit
  406 | struct wordvalue {
      |        ^
/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-czech.cpp:105:24: note: the first difference of corresponding definitions is field 'word'
  105 |           const char * word;
      |                        ^
/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-win1250ch.cpp:407:23: note: a field of same name but different type is defined in another translation unit
  407 |         const uchar * word;
      |                       ^
/mysql-workbench-community-8.0.38-src/library/sql.parser/source/ctype-czech.cpp:103:8: note: type 'const char' should match type 'const uchar'
  103 | struct wordvalue
      |        ^
lto1: some warnings being treated as errors
lto-wrapper: fatal error: /usr/bin/c++ returned 1 exit status
compilation terminated.
/usr/bin/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.