Bug#42733: Type-punning warnings when compiling MySQL --
strict aliasing violations.
Essentially, the problem is that large parts of the server were
developed in simpler times (last decades, pre C99 standard) when
strict aliasing and compilers supporting such optimizations were
rare to non-existent. Thus, when compiling the server with a modern
compiler that uses strict aliasing rules to perform optimizations,
there are several places in the code that might trigger undefined
behavior.
As evinced by some recent bugs, GCC does a somewhat good of job
misoptimizing such code, but on the other hand also gives warnings
about suspicious code. One problem is that the warnings aren't
always accurate, yet we can't afford to just shut them off as we
might miss real cases. False-positive cases are aggravated mostly
by casts that are likely to trigger undefined behavior.
The solution is to start a cleanup process focused on fixing and
reducing the amount of strict-aliasing related warnings produced
by GCC and others compilers. A good deal of noise reduction can
be achieved by just removing useless casts that are product of
historical cruft and are likely to trigger undefined behavior if
dereferenced.
client/mysql.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysql_upgrade.c:
Remove now-unnecessary casts.
client/mysqladmin.cc:
Remove now-unnecessary casts.
Break up large strings.
client/mysqlbinlog.cc:
Remove now-unnecessary casts.
client/mysqlcheck.c:
Remove now-unnecessary casts.
client/mysqldump.c:
Remove now-unnecessary casts.
client/mysqlimport.c:
Remove now-unnecessary casts.
client/mysqlshow.c:
Remove now-unnecessary casts.
client/mysqlslap.c:
Remove now-unnecessary casts.
client/mysqltest.cc:
Remove now-unnecessary casts.
extra/comp_err.c:
Remove now-unnecessary casts.
extra/my_print_defaults.c:
Remove now-unnecessary casts.
Break up large strings.
extra/mysql_waitpid.c:
Remove now-unnecessary casts.
extra/perror.c:
Remove now-unnecessary casts.
extra/resolve_stack_dump.c:
Remove now-unnecessary casts.
extra/resolveip.c:
Remove now-unnecessary casts.
include/my_getopt.h:
Use a void pointer type as the opaque type to avoid problems with type
incompatibility -- GCC issues warnings when the type name is not type
compatible with a operand. As a side bonus, a explicit cast won't be
necessary anymore.
include/sslopt-longopts.h:
Remove now-unnecessary casts.
Break up large strings.
mysys/my_getopt.c:
Update opaque type and introduce a type definition for the
argument to my_getopt_register_get_addr.
server-tools/instance-manager/options.cc:
Remove now-unnecessary casts.
sql/mysqld.cc:
Remove now-unnecessary casts.
Break up large strings.
Update mysql_getopt_value prototype (the old prototype
was different from the definition anyway).
sql/sql_plugin.cc:
The type of a pointer to a function must be compatible with the
pointed-to function type, otherwise the behavior is undefined.
sql/table.cc:
The variable buf pointer to pointer to pointer to constant char
could improperly alias a incompatible type in call to fix_type_
pointers. Since this was actually dead code, it is simply removed.
sql/unireg.cc:
Remove call to get_form_pos. The code creates a new FRM file which
is always truncated and writes the form position as 0. Hence, no
need to retrieve it, we now for sure it is 0.
storage/archive/archive_reader.c:
Remove now-unnecessary casts.
storage/myisam/ft_nlq_search.c:
Read weight directly from the buffer.
storage/myisam/fulltext.h:
Add explanation about the type duality of a key buffer.
Add accessor macro to retrieve a FT float value.
storage/myisam/mi_test1.c:
Remove now-unnecessary casts.
storage/myisam/myisam_ftdump.c:
Read weight directly from the buffer.
storage/myisam/myisamchk.c:
Remove now-unnecessary casts.
storage/myisam/myisamlog.c:
A pointer to char was used to alias a pointer to pointer to
unsigned char, thus violating strict aliasing rules.
storage/myisam/myisampack.c:
Remove now-unnecessary casts.
strings/decimal.c:
Remove aliasing violation, printing the value is enough for
debugging purposes.
tests/mysql_client_test.c:
Remove now-unnecessary casts.
"Enable automatic rehashing. One doesn't need to use 'rehash' to get table and field completion, but startup and reconnecting may take a longer time. Disable with --disable-auto-rehash.",
"No automatic rehashing. One has to use 'rehash' to get table and field completion. This gives a quicker start of mysql and disables rehashing on reconnect.",
"No automatic rehashing. One has to use 'rehash' to get table and field "
"completion. This gives a quicker start of mysql and disables rehashing "
"on reconnect.",
0,0,0,GET_NO_ARG,NO_ARG,0,0,0,0,0,0},
{"batch",'B',
"Don't use history file. Disable interactive behavior. (Enables --silent.)",0,0,0,GET_NO_ARG,NO_ARG,0,0,0,0,0,0},
"Don't use history file. Disable interactive behavior. (Enables --silent.)",
0,0,0,GET_NO_ARG,NO_ARG,0,0,0,0,0,0},
{"character-sets-dir",OPT_CHARSETS_DIR,
"Directory for character set files.",(uchar**)&charsets_dir,
"Enable named commands. Named commands mean this program's internal commands; see mysql> help . When enabled, the named commands can be used from any line of the query, otherwise only from the first line, before an enter. Disable with --disable-named-commands. This option is disabled by default.",
"Only update the default database. This is useful for skipping updates to other database in the update log.",
"Only update the default database. This is useful for skipping updates "
"to other database in the update log.",
0,0,0,GET_NO_ARG,NO_ARG,0,0,0,0,0,0},
#ifdef USE_POPEN
{"pager",OPT_PAGER,
"Pager to use to display results. If you don't supply an option, the default pager is taken from your ENV variable PAGER. Valid pagers are less, more, cat [> filename], etc. See interactive help (\\h) also. This option does not work in batch mode. Disable with --disable-pager. This option is disabled by default.",
"Pager to use to display results. If you don't supply an option, the "
"default pager is taken from your ENV variable PAGER. Valid pagers are "
"less, more, cat [> filename], etc. See interactive help (\\h) also. "
"This option does not work in batch mode. Disable with --disable-pager. "
"This option is disabled by default.",
0,0,0,GET_STR,OPT_ARG,0,0,0,0,0,0},
{"no-pager",OPT_NOPAGER,
"Disable pager and print to stdout. See interactive help (\\h) also. WARNING: option deprecated; use --disable-pager instead.",
"Disable pager and print to stdout. See interactive help (\\h) also. "
"WARNING: option deprecated; use --disable-pager instead.",
{"table",'t',"Output in table format.",&output_tables,
&output_tables,0,GET_BOOL,NO_ARG,0,0,0,0,0,0},
{"tee",OPT_TEE,
"Append everything into outfile. See interactive help (\\h) also. Does not work in batch mode. Disable with --disable-tee. This option is disabled by default.",
"Append everything into outfile. See interactive help (\\h) also. "
"Does not work in batch mode. Disable with --disable-tee. "
"This option is disabled by default.",
0,0,0,GET_STR,REQUIRED_ARG,0,0,0,0,0,0},
{"no-tee",OPT_NOTEE,"Disable outfile. See interactive help (\\h) also. WARNING: Option deprecated; use --disable-tee instead.",0,0,0,GET_NO_ARG,
NO_ARG,0,0,0,0,0,0},
{"no-tee",OPT_NOTEE,"Disable outfile. See interactive help (\\h) also. "
"WARNING: Option deprecated; use --disable-tee instead.",
0,0,0,GET_NO_ARG,NO_ARG,0,0,0,0,0,0},
#ifndef DONT_ALLOW_USER_CHANGE
{"user",'u',"User for login if not current user.",(uchar**)¤t_user,
"If you are using this option with CHECK TABLE, it will ensure that the table is 100 percent consistent, but will take a long time. If you are using this option with REPAIR TABLE, it will force using old slow repair with keycache method, instead of much faster repair by sorting.",
"Faster than extended-check, but only finds 99.99 percent of all errors. Should be good enough for most cases.",
0,0,0,GET_NO_ARG,NO_ARG,0,0,0,0,0,0},
{"write-binlog",OPT_WRITE_BINLOG,
"Log ANALYZE, OPTIMIZE and REPAIR TABLE commands. Enabled by default; use --skip-write-binlog when commands should not be sent to replication slaves.",
{"protocol",OPT_MYSQL_PROTOCOL,"The protocol to use for connection (tcp, socket, pipe, memory).",
0,0,0,GET_STR,REQUIRED_ARG,0,0,0,0,0,0},
{"quick",'q',
"If you are using this option with CHECK TABLE, it prevents the check from scanning the rows to check for wrong links. This is the fastest check. If you are using this option with REPAIR TABLE, it will try to repair only the index tree. This is the fastest repair method for a table.",
"Change the dump to be compatible with a given mode. By default tables are dumped in a format optimized for MySQL. Legal modes are: ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, no_field_options. One can use several modes separated by commas. Note: Requires MySQL server version 4.1.0 or higher. This option is ignored with earlier server versions.",
"Dump several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names. 'USE db_name;' will be included in the output.",
"'/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and '/*!40000 ALTER TABLE tb_name ENABLE KEYS */; will be put in the output.",(uchar**)&opt_disable_keys,
"Sorts each table's rows by primary key, or first unique key, if such a key exists. Useful when dumping a MyISAM table to be loaded into an InnoDB table, but will make the dump itself take considerably longer.",
"Direct output to a given file. This option should be used in MSDOS, because it prevents new line '\\n' from being converted to '\\r\\n' (carriage return + line feed).",
0,0,0,GET_STR,REQUIRED_ARG,0,0,0,0,0,0},
{"routines",'R',"Dump stored routines (functions and procedures).",
"SET TIME_ZONE='+00:00' at top of dump to allow dumping of TIMESTAMP data when a server has data in different time zones or data is being moved between servers with different time zones.",
{"config-file",'c',"Deprecated, please use --defaults-file instead. Name of config file to read; if no extension is given, default extension (e.g., .ini or .cnf) will be added",
{"defaults-file",'c',"Like --config-file, except: if first option, then read this file only, do not read global or per-user config files; should be the first option",
"Force auto_increment to start at this or higher value. If no value is given, then sets the next auto_increment value to the highest used value for the auto key + 1.",
(uchar**)&new_auto_increment,
(uchar**)&new_auto_increment,
&new_auto_increment,&new_auto_increment,
0,GET_ULL,OPT_ARG,0,0,0,0,0,0},
{"silent",'s',
"Only print errors. One can use two -s to make archive_reader very silent.",
"Max length of data file (when recreating data-file when it's full).",
(uchar**)&check_param.max_data_file_length,
(uchar**)&check_param.max_data_file_length,
&check_param.max_data_file_length,
&check_param.max_data_file_length,
0,GET_LL,REQUIRED_ARG,0,0,0,0,0,0},
{"extend-check",'e',
"If used when checking a table, ensure that the table is 100 percent consistent, which will take a long time. If used when repairing a table, try to recover every possible row from the data file. Normally this will also find a lot of garbage rows; Don't use this option with repair if you are not totally desperate.",
"Force auto_increment to start at this or higher value. If no value is given, then sets the next auto_increment value to the highest used value for the auto key + 1.",
"Sort records according to an index. This makes your data much more localized and may speed up things. (It may be VERY slow to do a sort the first time!)",
(uchar**)&check_param.opt_sort_key,
(uchar**)&check_param.opt_sort_key,
&check_param.opt_sort_key,
&check_param.opt_sort_key,
0,GET_UINT,REQUIRED_ARG,0,0,0,0,0,0},
{"tmpdir",'t',
"Path for temporary files.",
(uchar**)&opt_tmpdir,
&opt_tmpdir,
0,0,GET_STR,REQUIRED_ARG,0,0,0,0,0,0},
{"update-state",'U',
"Mark tables as crashed if any errors were found.",