1
0
mirror of https://github.com/MariaDB/server.git synced 2025-04-18 21:44:20 +03:00

Tag my_vsnprintf.c with ATTRIBUTE_FORMAT

[Breaking]
Good news:
GCC now checks your `my_snprintf` (direct) calls (`-Wformat` was on);
Bad news:
The build process no longer lets your incorrect
formats/arguments sneak past (`-Werror` was also on).

As such, this commit also migrates all direct `my_snprintf` calls from
the old specifiers to MDEV-21978’s new `-Wformat`-compatible suffixes.
The next commits will cover non-direct calls to `my_snprintf`.
(I call them “`my_snprintf` descendants”.)

This commit does not update the ABI records because
there’re more ABI “changes” to come – half a dozen
`include/mysql/plugin_*.h.pp`s are now missing the new `__attribute__`s.
This commit is contained in:
ParadoxV5 2024-06-28 20:48:51 -06:00 committed by Sergei Golubchik
parent f3617981ad
commit 5100773ab9
10 changed files with 36 additions and 27 deletions

View File

@ -556,7 +556,7 @@ static void find_tool(char *tool_executable_name, const char *tool_name,
len= (int)(last_fn_libchar - self_name);
my_snprintf(tool_executable_name, FN_REFLEN, "%.*b%c%s",
my_snprintf(tool_executable_name, FN_REFLEN, "%.*sB%c%s",
len, self_name, FN_LIBCHAR, tool_name);
}

View File

@ -631,7 +631,7 @@ print_use_stmt(PRINT_EVENT_INFO* pinfo, const Query_log_event *ev)
return;
// In case of rewrite rule print USE statement for db_to
my_fprintf(result_file, "use %`s%s\n", db_to, pinfo->delimiter);
my_fprintf(result_file, "use %sQ%s\n", db_to, pinfo->delimiter);
// Copy the *original* db to pinfo to suppress emitting
// of USE stmts by log_event print-functions.

View File

@ -551,7 +551,7 @@ static int is_view(const char *table)
int view;
DBUG_ENTER("is_view");
my_snprintf(query, sizeof(query), "SHOW CREATE TABLE %`s", table);
my_snprintf(query, sizeof(query), "SHOW CREATE TABLE %sQ", table);
if (mysql_query(sock, query))
{
fprintf(stderr, "Failed to %s\n", query);
@ -800,7 +800,7 @@ static int fix_table_storage_name(const char *name)
if (strncmp(name, "#mysql50#", 9))
DBUG_RETURN(1);
my_snprintf(qbuf, sizeof(qbuf), "RENAME TABLE %`s TO %`s",
my_snprintf(qbuf, sizeof(qbuf), "RENAME TABLE %sQ TO %sQ",
name, name + 9);
rc= run_query(qbuf, 1);
@ -817,7 +817,7 @@ static int fix_database_storage_name(const char *name)
if (strncmp(name, "#mysql50#", 9))
DBUG_RETURN(1);
my_snprintf(qbuf, sizeof(qbuf), "ALTER DATABASE %`s UPGRADE DATA DIRECTORY "
my_snprintf(qbuf, sizeof(qbuf), "ALTER DATABASE %sQ UPGRADE DATA DIRECTORY "
"NAME", name);
rc= run_query(qbuf, 1);
if (!opt_silent)
@ -1026,7 +1026,7 @@ static void insert_table_name(DYNAMIC_ARRAY *arr, char *in, size_t dblen)
{
char buf[NAME_LEN*2+2];
in[dblen]= 0;
my_snprintf(buf, sizeof(buf), "%`s.%`s", in, in + dblen + 1);
my_snprintf(buf, sizeof(buf), "%sQ.%sQ", in, in + dblen + 1);
insert_dynamic(arr, (uchar*) buf);
}

View File

@ -1776,7 +1776,8 @@ const MY_CONTRACTIONS *my_charset_get_contractions(CHARSET_INFO *cs,
int level);
extern size_t my_vsnprintf_ex(CHARSET_INFO *cs, char *to, size_t n,
const char* fmt, va_list ap);
const char* fmt, va_list ap)
ATTRIBUTE_FORMAT(printf, 4, 0);
/*
Convert a string between two character sets.

View File

@ -723,9 +723,11 @@ extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
extern FILE *my_freopen(const char *path, const char *mode, FILE *stream);
extern int my_fclose(FILE *fd,myf MyFlags);
extern int my_vfprintf(FILE *stream, const char* format, va_list args);
extern int my_vfprintf(FILE *stream, const char* format, va_list args)
ATTRIBUTE_FORMAT(printf, 2, 0);
extern const char* my_strerror(char *buf, size_t len, int nr);
extern int my_fprintf(FILE *stream, const char* format, ...);
extern int my_fprintf(FILE *stream, const char* format, ...)
ATTRIBUTE_FORMAT(printf, 2, 3);
extern File my_fileno(FILE *fd);
extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
extern int my_chmod(const char *name, mode_t mode, myf my_flags);

View File

@ -93,10 +93,13 @@ extern "C" {
#include <stdarg.h>
#include <stdlib.h>
#endif
#include <my_attribute.h>
extern struct my_snprintf_service_st {
size_t (*my_snprintf_type)(char*, size_t, const char*, ...);
size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list);
size_t (*my_snprintf_type)(char*, size_t, const char*, ...)
ATTRIBUTE_FORMAT_FPTR(printf, 3, 4);
size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list)
ATTRIBUTE_FORMAT_FPTR(printf, 3, 0);
} *my_snprintf_service;
#ifdef MYSQL_DYNAMIC_PLUGIN
@ -106,8 +109,10 @@ extern struct my_snprintf_service_st {
#else
size_t my_snprintf(char* to, size_t n, const char* fmt, ...);
size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap);
size_t my_snprintf(char* to, size_t n, const char* fmt, ...)
ATTRIBUTE_FORMAT(printf, 3, 4);
size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
ATTRIBUTE_FORMAT(printf, 3, 0);
#endif

View File

@ -3303,7 +3303,7 @@ static void get_type_name(uint type, unsigned char** meta_ptr,
{
switch (type) {
case MYSQL_TYPE_LONG:
my_snprintf(typestr, typestr_length, "%s", "INT");
my_snprintf(typestr, typestr_length, "INT");
break;
case MYSQL_TYPE_TINY:
my_snprintf(typestr, typestr_length, "TINYINT");
@ -3373,20 +3373,21 @@ static void get_type_name(uint type, unsigned char** meta_ptr,
break;
case MYSQL_TYPE_BLOB:
{
bool is_text= (cs && cs->number != my_charset_bin.number);
const char *names[5][2] = {
{"INVALID_BLOB(%d)", "INVALID_TEXT(%d)"},
{"TINYBLOB", "TINYTEXT"},
{"BLOB", "TEXT"},
{"MEDIUMBLOB", "MEDIUMTEXT"},
{"LONGBLOB", "LONGTEXT"}
const char *type_name=
(cs && cs->number != my_charset_bin.number) ? "TEXT" : "BLOB";
const char *names[5]= {
NullS,
"TINY",
"",
"MEDIUM",
"LONG"
};
unsigned char size= **meta_ptr;
if (size == 0 || size > 4)
my_snprintf(typestr, typestr_length, names[0][is_text], size);
my_snprintf(typestr, typestr_length, "INVALID_%s(%d)", type_name, size);
else
my_snprintf(typestr, typestr_length, names[**meta_ptr][is_text]);
my_snprintf(typestr, typestr_length, "%s%s", names[size], type_name);
(*meta_ptr)++;
}
@ -3423,7 +3424,7 @@ static void get_type_name(uint type, unsigned char** meta_ptr,
"MULTILINESTRING", "MULTIPOLYGON", "GEOMETRYCOLLECTION"
};
if (geometry_type < 8)
my_snprintf(typestr, typestr_length, names[geometry_type]);
my_snprintf(typestr, typestr_length, "%s", names[geometry_type]);
else
my_snprintf(typestr, typestr_length, "INVALID_GEOMETRY_TYPE(%u)",
geometry_type);

View File

@ -711,7 +711,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
protocol->store(&table_name, system_charset_info);
protocol->store(operator_name, system_charset_info);
protocol->store(&error_clex_str, system_charset_info);
length= my_snprintf(buff, sizeof(buff),
length= my_snprintf(buff, sizeof(buff), "%s",
ER_THD(thd, ER_PARTITION_DOES_NOT_EXIST));
protocol->store(buff, length, system_charset_info);
if(protocol->write())

View File

@ -1237,7 +1237,7 @@ update_binlog:
if (ha_table_exists(thd, &tbl->db, &tbl->table_name))
continue;
tbl_name_len= my_snprintf(quoted_name, sizeof(quoted_name), "%`s",
tbl_name_len= my_snprintf(quoted_name, sizeof(quoted_name), "%sQ",
tbl->table_name.str);
tbl_name_len++; /* +1 for the comma */
if (query_pos + tbl_name_len + 1 >= query_end)

View File

@ -1070,7 +1070,7 @@ static int show_func_example(MYSQL_THD thd, struct st_mysql_show_var *var,
var->value= buf; // it's of SHOW_VAR_FUNC_BUFF_SIZE bytes
my_snprintf(buf, SHOW_VAR_FUNC_BUFF_SIZE,
"enum_var is %lu, ulong_var is %lu, int_var is %d, "
"double_var is %f, %.6b", // %b is a MariaDB/MySQL extension
"double_var is %f, %.6sB", // %sB is a MariaDB extension
srv_enum_var, srv_ulong_var, THDVAR(thd, int_var),
srv_double_var, "really");
return 0;