Tag the sql/log.h family with ATTRIBUTE_FORMAT

Let GCC `-Wformat` check formats sent to
these users of `my_vsnprintf_ex` users (heh)
This commit is contained in:
ParadoxV5 2025-01-12 22:03:23 -07:00 committed by Sergei Golubchik
parent 21dfef474c
commit 2392bd02d8
16 changed files with 36 additions and 24 deletions

View File

@ -1213,6 +1213,7 @@ public:
const char *user_host, size_t user_host_len, ulonglong query_utime, const char *user_host, size_t user_host_len, ulonglong query_utime,
ulonglong lock_utime, bool is_command, ulonglong lock_utime, bool is_command,
const char *sql_text, size_t sql_text_len)= 0; const char *sql_text, size_t sql_text_len)= 0;
ATTRIBUTE_FORMAT(printf, 3, 0)
virtual bool log_error(enum loglevel level, const char *format, virtual bool log_error(enum loglevel level, const char *format,
va_list args)= 0; va_list args)= 0;
virtual bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id, virtual bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id,
@ -1240,6 +1241,7 @@ public:
const char *user_host, size_t user_host_len, ulonglong query_utime, const char *user_host, size_t user_host_len, ulonglong query_utime,
ulonglong lock_utime, bool is_command, ulonglong lock_utime, bool is_command,
const char *sql_text, size_t sql_text_len) override; const char *sql_text, size_t sql_text_len) override;
ATTRIBUTE_FORMAT(printf, 3, 0)
bool log_error(enum loglevel level, const char *format, bool log_error(enum loglevel level, const char *format,
va_list args) override; va_list args) override;
bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id, bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id,
@ -1270,6 +1272,7 @@ public:
const char *user_host, size_t user_host_len, ulonglong query_utime, const char *user_host, size_t user_host_len, ulonglong query_utime,
ulonglong lock_utime, bool is_command, ulonglong lock_utime, bool is_command,
const char *sql_text, size_t sql_text_len) override; const char *sql_text, size_t sql_text_len) override;
ATTRIBUTE_FORMAT(printf, 3, 0)
bool log_error(enum loglevel level, const char *format, bool log_error(enum loglevel level, const char *format,
va_list args) override; va_list args) override;
bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id, bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id,
@ -1326,10 +1329,12 @@ public:
void cleanup_base(); void cleanup_base();
/* Free memory. Nothing could be logged after this function is called */ /* Free memory. Nothing could be logged after this function is called */
void cleanup_end(); void cleanup_end();
ATTRIBUTE_FORMAT(printf, 3, 0) // 1st arg is the implicit `this`
bool error_log_print(enum loglevel level, const char *format, bool error_log_print(enum loglevel level, const char *format,
va_list args); va_list args);
bool slow_log_print(THD *thd, const char *query, size_t query_length, bool slow_log_print(THD *thd, const char *query, size_t query_length,
ulonglong current_utime); ulonglong current_utime);
ATTRIBUTE_FORMAT(printf, 4, 0)
bool general_log_print(THD *thd,enum enum_server_command command, bool general_log_print(THD *thd,enum enum_server_command command,
const char *format, va_list args); const char *format, va_list args);
bool general_log_write(THD *thd, enum enum_server_command command, bool general_log_write(THD *thd, enum enum_server_command command,
@ -1367,22 +1372,26 @@ enum enum_binlog_format {
int query_error_code(THD *thd, bool not_killed); int query_error_code(THD *thd, bool not_killed);
uint purge_log_get_error_code(int res); uint purge_log_get_error_code(int res);
int vprint_msg_to_log(enum loglevel level, const char *format, va_list args); int vprint_msg_to_log(enum loglevel level, const char *format, va_list args)
void sql_print_error(const char *format, ...); ATTRIBUTE_FORMAT(printf, 2, 0);
void sql_print_warning(const char *format, ...); void sql_print_error(const char *format, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
void sql_print_information(const char *format, ...); void sql_print_warning(const char *format, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
void sql_print_information_v(const char *format, va_list ap); void sql_print_information(const char *format, ...)
typedef void (*sql_print_message_func)(const char *format, ...); ATTRIBUTE_FORMAT(printf, 1, 2);
void sql_print_information_v(const char *format, va_list ap)
ATTRIBUTE_FORMAT(printf, 1, 0);
typedef void (*sql_print_message_func)(const char *format, ...)
ATTRIBUTE_FORMAT_FPTR(printf, 1, 2);
extern sql_print_message_func sql_print_message_handlers[]; extern sql_print_message_func sql_print_message_handlers[];
int error_log_print(enum loglevel level, const char *format, int error_log_print(enum loglevel level, const char *format,
va_list args); va_list args) ATTRIBUTE_FORMAT(printf, 2, 0);
bool slow_log_print(THD *thd, const char *query, uint query_length, bool slow_log_print(THD *thd, const char *query, uint query_length,
ulonglong current_utime); ulonglong current_utime);
bool general_log_print(THD *thd, enum enum_server_command command, bool general_log_print(THD *thd, enum enum_server_command command,
const char *format,...); const char *format,...) ATTRIBUTE_FORMAT(printf, 3, 4);
bool general_log_write(THD *thd, enum enum_server_command command, bool general_log_write(THD *thd, enum enum_server_command command,
const char *query, size_t query_length); const char *query, size_t query_length);

View File

@ -9252,7 +9252,7 @@ static int test_if_case_insensitive(const char *dir_name)
buff, 0666, O_RDWR, MYF(0))) < 0) buff, 0666, O_RDWR, MYF(0))) < 0)
{ {
if (!opt_abort) if (!opt_abort)
sql_print_warning("Can't create test file '%s' (Errcode: %M)", buff, my_errno); sql_print_warning("Can't create test file '%s' (Errcode: %iE)", buff, my_errno);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
mysql_file_close(file, MYF(0)); mysql_file_close(file, MYF(0));

View File

@ -1522,7 +1522,7 @@ bool Master_info_index::remove_master_info(Master_info *mi, bool clear_log_files
my_close(index_file_nr,MYF(0)); my_close(index_file_nr,MYF(0));
sql_print_error("Create of Master Info Index file '%s' failed with " sql_print_error("Create of Master Info Index file '%s' failed with "
"error: %M", "error: %iE",
index_file_name, error); index_file_name, error);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }

View File

@ -247,7 +247,7 @@ a file name for --relay-log-index option", opt_relaylog_index_name);
{ {
mysql_mutex_unlock(log_lock); mysql_mutex_unlock(log_lock);
mysql_mutex_unlock(&data_lock); mysql_mutex_unlock(&data_lock);
sql_print_error("Failed when trying to open logs for '%s' in Relay_log_info::init(). Error: %M", ln, my_errno); sql_print_error("Failed when trying to open logs for '%s' in Relay_log_info::init(). Error: %iE", ln, my_errno);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
mysql_mutex_unlock(log_lock); mysql_mutex_unlock(log_lock);

View File

@ -245,7 +245,7 @@ void Ack_receiver::run()
if (listener.got_error()) if (listener.got_error())
{ {
sql_print_error("Got error %M starting ack receiver thread", sql_print_error("Got error %iE starting ack receiver thread",
listener.got_error()); listener.got_error());
return; return;
} }

View File

@ -148,7 +148,7 @@ void start_handle_manager()
if ((err= mysql_thread_create(key_thread_handle_manager, &hThread, if ((err= mysql_thread_create(key_thread_handle_manager, &hThread,
&connection_attrib, handle_manager, 0))) &connection_attrib, handle_manager, 0)))
{ {
sql_print_warning("Can't create handle_manager thread (errno: %M)", err); sql_print_warning("Can't create handle_manager thread (errno: %iE)", err);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }

View File

@ -4108,7 +4108,7 @@ bool verify_data_with_partition(TABLE *table, TABLE *part_table,
if (table->in_use->lex->without_validation) if (table->in_use->lex->without_validation)
{ {
sql_print_warning("Table %`s.%`s was altered WITHOUT VALIDATION: " sql_print_warning("Table %sQ.%sQ was altered WITHOUT VALIDATION: "
"the table might be corrupted", "the table might be corrupted",
part_table->s->db.str, part_table->s->table_name.str); part_table->s->db.str, part_table->s->table_name.str);
DBUG_RETURN(false); DBUG_RETURN(false);

View File

@ -932,7 +932,7 @@ int mariadb_fix_view(THD *thd, TABLE_LIST *view, bool wrong_checksum,
view->db.str, view->table_name.str); view->db.str, view->table_name.str);
DBUG_RETURN(HA_ADMIN_INTERNAL_ERROR); DBUG_RETURN(HA_ADMIN_INTERNAL_ERROR);
} }
sql_print_information("View %`s.%`s: the version is set to %llu%s%s", sql_print_information("View %sQ.%sQ: the version is set to %llu%s%s",
view->db.str, view->table_name.str, view->db.str, view->table_name.str,
view->mariadb_version, view->mariadb_version,
(wrong_checksum ? ", checksum corrected" : ""), (wrong_checksum ? ", checksum corrected" : ""),

View File

@ -10747,12 +10747,12 @@ void TR_table::warn_schema_incorrect(const char *reason)
{ {
if (MYSQL_VERSION_ID == table->s->mysql_version) if (MYSQL_VERSION_ID == table->s->mysql_version)
{ {
sql_print_error("%`s.%`s schema is incorrect: %s.", sql_print_error("%sQ.%sQ schema is incorrect: %s.",
db.str, table_name.str, reason); db.str, table_name.str, reason);
} }
else else
{ {
sql_print_error("%`s.%`s schema is incorrect: %s. Created with MariaDB %d, " sql_print_error("%sQ.%sQ schema is incorrect: %s. Created with MariaDB %d, "
"now running %d.", "now running %d.",
db.str, table_name.str, reason, MYSQL_VERSION_ID, db.str, table_name.str, reason, MYSQL_VERSION_ID,
static_cast<int>(table->s->mysql_version)); static_cast<int>(table->s->mysql_version));
@ -10763,7 +10763,7 @@ bool TR_table::check(bool error)
{ {
if (error) if (error)
{ {
sql_print_warning("%`s.%`s does not exist (open failed).", db.str, sql_print_warning("%sQ.%sQ does not exist (open failed).", db.str,
table_name.str); table_name.str);
return true; return true;
} }

View File

@ -577,6 +577,7 @@ class Table_check_intact
{ {
protected: protected:
bool has_keys; bool has_keys;
ATTRIBUTE_FORMAT(printf, 3, 4) // 1st arg is the implicit `this`
virtual void report_error(uint code, const char *fmt, ...)= 0; virtual void report_error(uint code, const char *fmt, ...)= 0;
public: public:
@ -594,6 +595,7 @@ public:
class Table_check_intact_log_error : public Table_check_intact class Table_check_intact_log_error : public Table_check_intact
{ {
protected: protected:
ATTRIBUTE_FORMAT(printf, 3, 4)
void report_error(uint, const char *fmt, ...) override; void report_error(uint, const char *fmt, ...) override;
public: public:
Table_check_intact_log_error() : Table_check_intact(true) {} Table_check_intact_log_error() : Table_check_intact(true) {}

View File

@ -54,7 +54,7 @@ extern "C" {
/* Skip writing to the error log to avoid mtr complaints */ /* Skip writing to the error log to avoid mtr complaints */
DBUG_EXECUTE_IF("simulate_out_of_memory", return;); DBUG_EXECUTE_IF("simulate_out_of_memory", return;);
sql_print_error(ER_DEFAULT(ER_OUT_OF_RESOURCES)); sql_print_error("%s", ER_DEFAULT(ER_OUT_OF_RESOURCES));
} }
} }

View File

@ -1932,7 +1932,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
Most probably user has mistyped time zone name, so no need to bark here Most probably user has mistyped time zone name, so no need to bark here
unless we need it for debugging. unless we need it for debugging.
*/ */
sql_print_error("Can't find description of time zone '%.*b'", sql_print_error("Can't find description of time zone '%.*sB'",
tz_name->length(), tz_name->ptr()); tz_name->length(), tz_name->ptr());
#endif #endif
goto end; goto end;

View File

@ -1242,7 +1242,7 @@ uint64_t btr_read_autoinc_with_fallback(const dict_table_t *table,
{ {
sql_print_information("InnoDB: Resetting PAGE_ROOT_AUTO_INC from " sql_print_information("InnoDB: Resetting PAGE_ROOT_AUTO_INC from "
UINT64PF " to " UINT64PF UINT64PF " to " UINT64PF
" on table %`.*s.%`s (created with version %lu)", " on table %.*sQ.%sQ (created with version %lu)",
autoinc, max_autoinc, autoinc, max_autoinc,
int(table->name.dblen()), table->name.m_name, int(table->name.dblen()), table->name.m_name,
table->name.basename(), mysql_version); table->name.basename(), mysql_version);

View File

@ -4626,7 +4626,7 @@ static void row_import_autoinc(dict_table_t *table, row_prebuilt_t *prebuilt,
btr_write_autoinc(dict_table_get_first_index(table), autoinc - 1); btr_write_autoinc(dict_table_get_first_index(table), autoinc - 1);
autoinc_set: autoinc_set:
table->autoinc= autoinc; table->autoinc= autoinc;
sql_print_information("InnoDB: %`.*s.%`s autoinc value set to " UINT64PF, sql_print_information("InnoDB: %.*sQ.%sQ autoinc value set to " UINT64PF,
int(table->name.dblen()), table->name.m_name, int(table->name.dblen()), table->name.m_name,
table->name.basename(), autoinc); table->name.basename(), autoinc);
} }

View File

@ -1208,7 +1208,7 @@ static dberr_t row_mysql_get_table_error(trx_t *trx, dict_table_t *table)
} }
const int dblen= int(table->name.dblen()); const int dblen= int(table->name.dblen());
sql_print_error("InnoDB .ibd file is missing for table %`.*s.%`s", sql_print_error("InnoDB .ibd file is missing for table %.*sQ.%sQ",
dblen, table->name.m_name, table->name.m_name + dblen + 1); dblen, table->name.m_name, table->name.m_name + dblen + 1);
return DB_TABLESPACE_NOT_FOUND; return DB_TABLESPACE_NOT_FOUND;
} }

View File

@ -1064,7 +1064,8 @@ const int MYROCKS_MARIADB_PLUGIN_MATURITY_LEVEL= MariaDB_PLUGIN_MATURITY_STABLE;
extern uint32_t rocksdb_ignore_datadic_errors; extern uint32_t rocksdb_ignore_datadic_errors;
void sql_print_verbose_info(const char *format, ...); void sql_print_verbose_info(const char *format, ...)
ATTRIBUTE_FORMAT(printf, 1, 2);
} // namespace myrocks } // namespace myrocks