• Monty's avatar
    Fix all warnings given by UBSAN · cc125beb
    Monty authored
    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
    cc125beb
sql_select.h 82.3 KB