MDEV-33478: Tests massively fail with clang-18 -fsanitize=memory

Starting with clang-16, MemorySanitizer appears to check that
uninitialized values not be passed by value nor returned.
Previously, it was allowed to copy uninitialized data in such cases.

get_foreign_key_info(): Remove a local variable that was passed
uninitialized to a function.

DsMrr_impl: Initialize key_buffer, because DsMrr_impl::dsmrr_init()
is reading it.

test_bind_result_ext1(): MYSQL_TYPE_LONG is 32 bits, hence we must
use a 32-bit type, such as int. sizeof(long) differs between
LP64 and LLP64 targets.
This commit is contained in:
Marko Mäkelä 2024-03-18 16:01:29 +02:00
parent fb774eb1eb
commit 09d991d01c
8 changed files with 25 additions and 19 deletions

View File

@ -1008,7 +1008,7 @@ static bool debug_sync_eval_action(THD *thd, char *action_str, char *action_end)
st_debug_sync_action *action= NULL; st_debug_sync_action *action= NULL;
const char *errmsg; const char *errmsg;
char *ptr; char *ptr;
char *token; char *token= nullptr;
uint token_length= 0; uint token_length= 0;
DBUG_ENTER("debug_sync_eval_action"); DBUG_ENTER("debug_sync_eval_action");
DBUG_ASSERT(thd); DBUG_ASSERT(thd);

View File

@ -90,7 +90,7 @@ public:
static void wrong_param_count_error(const LEX_CSTRING &schema_name, static void wrong_param_count_error(const LEX_CSTRING &schema_name,
const LEX_CSTRING &func_name); const LEX_CSTRING &func_name);
table_map not_null_tables_cache; table_map not_null_tables_cache= 0;
enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC, enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC,
GE_FUNC,GT_FUNC,FT_FUNC, GE_FUNC,GT_FUNC,FT_FUNC,

View File

@ -426,6 +426,7 @@ struct wait_for_commit;
class MYSQL_BIN_LOG: public TC_LOG, private MYSQL_LOG class MYSQL_BIN_LOG: public TC_LOG, private MYSQL_LOG
{ {
#ifdef HAVE_PSI_INTERFACE
/** The instrumentation key to use for @ LOCK_index. */ /** The instrumentation key to use for @ LOCK_index. */
PSI_mutex_key m_key_LOCK_index; PSI_mutex_key m_key_LOCK_index;
/** The instrumentation key to use for @ COND_relay_log_updated */ /** The instrumentation key to use for @ COND_relay_log_updated */
@ -440,6 +441,16 @@ class MYSQL_BIN_LOG: public TC_LOG, private MYSQL_LOG
PSI_cond_key m_key_COND_queue_busy; PSI_cond_key m_key_COND_queue_busy;
/** The instrumentation key to use for LOCK_binlog_end_pos. */ /** The instrumentation key to use for LOCK_binlog_end_pos. */
PSI_mutex_key m_key_LOCK_binlog_end_pos; PSI_mutex_key m_key_LOCK_binlog_end_pos;
#else
static constexpr PSI_mutex_key m_key_LOCK_index= 0;
static constexpr PSI_cond_key m_key_relay_log_update= 0;
static constexpr PSI_cond_key m_key_bin_log_update= 0;
static constexpr PSI_file_key m_key_file_log= 0, m_key_file_log_cache= 0;
static constexpr PSI_file_key m_key_file_log_index= 0;
static constexpr PSI_file_key m_key_file_log_index_cache= 0;
static constexpr PSI_cond_key m_key_COND_queue_busy= 0;
static constexpr PSI_mutex_key m_key_LOCK_binlog_end_pos= 0;
#endif
struct group_commit_entry struct group_commit_entry
{ {

View File

@ -556,10 +556,6 @@ class DsMrr_impl
public: public:
typedef void (handler::*range_check_toggle_func_t)(bool on); typedef void (handler::*range_check_toggle_func_t)(bool on);
DsMrr_impl()
: secondary_file(NULL),
rowid_filter(NULL) {};
void init(handler *h_arg, TABLE *table_arg) void init(handler *h_arg, TABLE *table_arg)
{ {
primary_file= h_arg; primary_file= h_arg;
@ -581,7 +577,7 @@ public:
int dsmrr_explain_info(uint mrr_mode, char *str, size_t size); int dsmrr_explain_info(uint mrr_mode, char *str, size_t size);
private: private:
/* Buffer to store (key, range_id) pairs */ /* Buffer to store (key, range_id) pairs */
Lifo_buffer *key_buffer; Lifo_buffer *key_buffer= nullptr;
/* /*
The "owner" handler object (the one that is expected to "own" this object The "owner" handler object (the one that is expected to "own" this object
@ -594,13 +590,13 @@ private:
Secondary handler object. (created when needed, we need it when we need Secondary handler object. (created when needed, we need it when we need
to run both index scan and rnd_pos() scan at the same time) to run both index scan and rnd_pos() scan at the same time)
*/ */
handler *secondary_file; handler *secondary_file= nullptr;
/* /*
The rowid filter that DS-MRR has "unpushed" from the storage engine. The rowid filter that DS-MRR has "unpushed" from the storage engine.
If it's present, DS-MRR will use it. If it's present, DS-MRR will use it.
*/ */
Rowid_filter *rowid_filter; Rowid_filter *rowid_filter= nullptr;
uint keyno; /* index we're running the scan on */ uint keyno; /* index we're running the scan on */
/* TRUE <=> need range association, buffers hold {rowid, range_id} pairs */ /* TRUE <=> need range association, buffers hold {rowid, range_id} pairs */

View File

@ -3260,7 +3260,7 @@ public:
Table_type table_type; /* Used for SHOW CREATE */ Table_type table_type; /* Used for SHOW CREATE */
List<Key_part_spec> ref_list; List<Key_part_spec> ref_list;
List<LEX_USER> users_list; List<LEX_USER> users_list;
List<Item> *insert_list,field_list,value_list,update_list; List<Item> *insert_list= nullptr,field_list,value_list,update_list;
List<List_item> many_values; List<List_item> many_values;
List<set_var_base> var_list; List<set_var_base> var_list;
List<set_var_base> stmt_var_list; //SET_STATEMENT values List<set_var_base> stmt_var_list; //SET_STATEMENT values

View File

@ -12108,7 +12108,7 @@ create_table_info_t::create_foreign_keys()
dict_index_t* index = NULL; dict_index_t* index = NULL;
fkerr_t index_error = FK_SUCCESS; fkerr_t index_error = FK_SUCCESS;
dict_index_t* err_index = NULL; dict_index_t* err_index = NULL;
ulint err_col; ulint err_col = 0;
const bool tmp_table = m_flags2 & DICT_TF2_TEMPORARY; const bool tmp_table = m_flags2 & DICT_TF2_TEMPORARY;
const CHARSET_INFO* cs = thd_charset(m_thd); const CHARSET_INFO* cs = thd_charset(m_thd);
const char* operation = "Create "; const char* operation = "Create ";
@ -15150,7 +15150,6 @@ get_foreign_key_info(
char tmp_buff[NAME_LEN+1]; char tmp_buff[NAME_LEN+1];
char name_buff[NAME_LEN+1]; char name_buff[NAME_LEN+1];
const char* ptr; const char* ptr;
LEX_CSTRING* referenced_key_name;
LEX_CSTRING* name = NULL; LEX_CSTRING* name = NULL;
if (dict_table_t::is_temporary_name(foreign->foreign_table_name)) { if (dict_table_t::is_temporary_name(foreign->foreign_table_name)) {
@ -15255,18 +15254,16 @@ get_foreign_key_info(
if (foreign->referenced_index if (foreign->referenced_index
&& foreign->referenced_index->name != NULL) { && foreign->referenced_index->name != NULL) {
referenced_key_name = thd_make_lex_string( f_key_info.referenced_key_name = thd_make_lex_string(
thd, thd,
f_key_info.referenced_key_name, nullptr,
foreign->referenced_index->name, foreign->referenced_index->name,
strlen(foreign->referenced_index->name), strlen(foreign->referenced_index->name),
1); 1);
} else { } else {
referenced_key_name = NULL; f_key_info.referenced_key_name = NULL;
} }
f_key_info.referenced_key_name = referenced_key_name;
pf_key_info = (FOREIGN_KEY_INFO*) thd_memdup(thd, &f_key_info, pf_key_info = (FOREIGN_KEY_INFO*) thd_memdup(thd, &f_key_info,
sizeof(FOREIGN_KEY_INFO)); sizeof(FOREIGN_KEY_INFO));

View File

@ -287,6 +287,8 @@ static int ftb_parse_query_internal(MYSQL_FTPARSER_PARAM *param,
uchar *end= (uchar*) query + len; uchar *end= (uchar*) query + len;
FT_WORD w; FT_WORD w;
w.pos= NULL;
w.len= 0;
info.prev= ' '; info.prev= ' ';
info.quot= 0; info.quot= 0;
while (ft_get_word(cs, start, end, &w, &info)) while (ft_get_word(cs, start, end, &w, &info))

View File

@ -3842,7 +3842,7 @@ static void test_bind_result_ext1()
short i_data; short i_data;
uchar b_data; uchar b_data;
int f_data; int f_data;
long bData; int bData;
char d_data[20]; char d_data[20];
double szData; double szData;
MYSQL_BIND my_bind[8]; MYSQL_BIND my_bind[8];
@ -3938,7 +3938,7 @@ static void test_bind_result_ext1()
fprintf(stdout, "\n data (float) : %d(%lu)", f_data, length[4]); fprintf(stdout, "\n data (float) : %d(%lu)", f_data, length[4]);
fprintf(stdout, "\n data (double) : %s(%lu)", d_data, length[5]); fprintf(stdout, "\n data (double) : %s(%lu)", d_data, length[5]);
fprintf(stdout, "\n data (bin) : %ld(%lu)", bData, length[6]); fprintf(stdout, "\n data (bin) : %d(%lu)", bData, length[6]);
fprintf(stdout, "\n data (str) : %g(%lu)", szData, length[7]); fprintf(stdout, "\n data (str) : %g(%lu)", szData, length[7]);
} }