mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fix all warnings given by UBSAN
The 'special' cases where we disable, suppress or circumvent UBSAN are: - ref10 source (as here we intentionally do some shifts that UBSAN complains about. - x86 version of optimized int#korr() methods. UBSAN do not like unaligned memory access of integers. Fixed by using byte_order_generic.h when compiling with UBSAN - We use smaller thread stack with ASAN and UBSAN, which forced me to disable a few tests that prints the thread stack size. - Verifying class types does not work for shared libraries. I added suppression in mysql-test-run.pl for this case. - Added '#ifdef WITH_UBSAN' when using integer arithmetic where it is safe to have overflows (two cases, in item_func.cc). Things fixed: - Don't left shift signed values (byte_order_generic.h, mysqltest.c, item_sum.cc and many more) - Don't assign not non existing values to enum variables. - Ensure that bool and enum values are properly initialized in constructors. This was needed as UBSAN checks that these types has correct values when one copies an object. (gcalc_tools.h, ha_partition.cc, item_sum.cc, partition_element.h ...) - Ensure we do not called handler functions on unallocated objects or deleted objects. (events.cc, sql_acl.cc). - Fixed bugs in Item_sp::Item_sp() where we did not call constructor on Query_arena object. - Fixed several cast of objects to an incompatible class! (Item.cc, Item_buff.cc, item_timefunc.cc, opt_subselect.cc, sql_acl.cc, sql_select.cc ...) - Ensure we do not do integer arithmetic that causes over or underflows. This includes also ++ and -- of integers. (Item_func.cc, Item_strfunc.cc, item_timefunc.cc, sql_base.cc ...) - Added JSON_VALUE_UNITIALIZED to json_value_types and ensure that value_type is initialized to this instead of to -1, which is not a valid enum value for json_value_types. - Ensure we do not call memcpy() when second argument could be null. Other things: - Changed struct st_position to an OBJECT and added an initialization function to it to ensure that we do not copy or use uninitialized members. The change to a class was also motived that we used "struct st_position" and POSITION randomly trough the code which was confusing. - Notably big rewrite in sql_acl.cc to avoid using deleted objects. - Changed in sql_partition to use '^' instead of '-'. This is safe as the operator is either 0 or 0x8000000000000000ULL. - Added check for select_nr < INT_MAX in JOIN::build_explain() to avoid bug when get_select() could return NULL. - Reordered elements in POSITION for better alignment. - Changed sql_test.cc::print_plan() to use pointers instead of objects. - Fixed bug in find_set() where could could execute '1 << -1'. - Added variable have_sanitizer, used by mtr. (This variable was before only in 10.5 and up). It can now have one of two values: ASAN or UBSAN. - Moved ~Archive_share() from ha_archive.cc to ha_archive.h and marked it virtual. This was an effort to get UBSAN to work with loaded storage engines. I kept the change as the new place is better. - Added in CONNECT engine COLBLK::SetName(), to get around a wrong cast in tabutil.cpp. Changes that should not be needed but had to be done to suppress warnings from UBSAN: - Added static_cast<<uint16_t>> around shift to get rid of a LOT of compiler warnings when using UBSAN. - Had to change some '/' of 2 base integers to shift to get rid of some compile time warnings. Fixes: MDEV-25505 Assertion `old_flags == ((my_flags & 0x10000U) ? 1 : 0) fixed (was caused by an old version if this commit). Reviewed by: - Json changes: Alexey Botchkov - Charset changes in ctype-uca.c: Alexander Barkov - InnoDB changes: Marko Mäkelä - sql_acl.cc changes: Vicențiu Ciorbaru - build_explain() changes: Sergey Petrunia Temporary commit to log changes for UBSAN
This commit is contained in:
@ -1546,98 +1546,7 @@ public:
|
||||
}
|
||||
|
||||
void init(THD *thd_arg, List<Item> &fields_arg, ulonglong select_options_arg,
|
||||
select_result *result_arg)
|
||||
{
|
||||
join_tab= 0;
|
||||
table= 0;
|
||||
table_count= 0;
|
||||
top_join_tab_count= 0;
|
||||
const_tables= 0;
|
||||
const_table_map= found_const_table_map= 0;
|
||||
aggr_tables= 0;
|
||||
eliminated_tables= 0;
|
||||
join_list= 0;
|
||||
implicit_grouping= FALSE;
|
||||
sort_and_group= 0;
|
||||
first_record= 0;
|
||||
do_send_rows= 1;
|
||||
duplicate_rows= send_records= 0;
|
||||
found_records= accepted_rows= 0;
|
||||
fetch_limit= HA_POS_ERROR;
|
||||
thd= thd_arg;
|
||||
sum_funcs= sum_funcs2= 0;
|
||||
procedure= 0;
|
||||
having= tmp_having= having_history= 0;
|
||||
having_is_correlated= false;
|
||||
group_list_for_estimates= 0;
|
||||
select_options= select_options_arg;
|
||||
result= result_arg;
|
||||
lock= thd_arg->lock;
|
||||
select_lex= 0; //for safety
|
||||
select_distinct= MY_TEST(select_options & SELECT_DISTINCT);
|
||||
no_order= 0;
|
||||
simple_order= 0;
|
||||
simple_group= 0;
|
||||
rand_table_in_field_list= 0;
|
||||
ordered_index_usage= ordered_index_void;
|
||||
need_distinct= 0;
|
||||
skip_sort_order= 0;
|
||||
with_two_phase_optimization= 0;
|
||||
save_qep= 0;
|
||||
spl_opt_info= 0;
|
||||
ext_keyuses_for_splitting= 0;
|
||||
spl_opt_info= 0;
|
||||
need_tmp= 0;
|
||||
hidden_group_fields= 0; /*safety*/
|
||||
error= 0;
|
||||
select= 0;
|
||||
return_tab= 0;
|
||||
ref_ptrs.reset();
|
||||
items0.reset();
|
||||
items1.reset();
|
||||
items2.reset();
|
||||
items3.reset();
|
||||
zero_result_cause= 0;
|
||||
optimization_state= JOIN::NOT_OPTIMIZED;
|
||||
have_query_plan= QEP_NOT_PRESENT_YET;
|
||||
initialized= 0;
|
||||
cleaned= 0;
|
||||
cond_equal= 0;
|
||||
having_equal= 0;
|
||||
exec_const_cond= 0;
|
||||
group_optimized_away= 0;
|
||||
no_rows_in_result_called= 0;
|
||||
positions= best_positions= 0;
|
||||
pushdown_query= 0;
|
||||
original_join_tab= 0;
|
||||
explain= NULL;
|
||||
tmp_table_keep_current_rowid= 0;
|
||||
|
||||
all_fields= fields_arg;
|
||||
if (&fields_list != &fields_arg) /* Avoid valgrind-warning */
|
||||
fields_list= fields_arg;
|
||||
non_agg_fields.empty();
|
||||
bzero((char*) &keyuse,sizeof(keyuse));
|
||||
having_value= Item::COND_UNDEF;
|
||||
tmp_table_param.init();
|
||||
tmp_table_param.end_write_records= HA_POS_ERROR;
|
||||
rollup.state= ROLLUP::STATE_NONE;
|
||||
|
||||
no_const_tables= FALSE;
|
||||
first_select= sub_select;
|
||||
set_group_rpa= false;
|
||||
group_sent= 0;
|
||||
|
||||
outer_ref_cond= pseudo_bits_cond= NULL;
|
||||
in_to_exists_where= NULL;
|
||||
in_to_exists_having= NULL;
|
||||
emb_sjm_nest= NULL;
|
||||
sjm_lookup_tables= 0;
|
||||
sjm_scan_tables= 0;
|
||||
is_orig_degenerated= false;
|
||||
|
||||
with_ties_order_count= 0;
|
||||
}
|
||||
select_result *result_arg);
|
||||
|
||||
/* True if the plan guarantees that it will be returned zero or one row */
|
||||
bool only_const_tables() { return const_tables == table_count; }
|
||||
|
Reference in New Issue
Block a user