Re: gcc 12.1.0 warning

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: gcc 12.1.0 warning
Дата
Msg-id 20240423165939.7tm2lthmuofzmcdq@awork3.anarazel.de
обсуждение исходный текст
Ответ на Re: gcc 12.1.0 warning  (Nazir Bilal Yavuz <byavuz81@gmail.com>)
Ответы Re: gcc 12.1.0 warning  (Nazir Bilal Yavuz <byavuz81@gmail.com>)
Список pgsql-hackers
Hi,

On 2024-04-15 11:25:05 +0300, Nazir Bilal Yavuz wrote:
> I am able to reproduce this. I regenerated the debian bookworm image
> and ran CI on REL_15_STABLE with this image.
> 
> CI Run: https://cirrus-ci.com/task/4978799442395136

Hm, not sure why I wasn't able to repro - now I can.

It actually seems like a legitimate warning: The caller allocates the key as

static struct config_generic *
find_option(const char *name, bool create_placeholders, bool skip_errors,
            int elevel)
{
    const char **key = &name;

and then does
    res = (struct config_generic **) bsearch((void *) &key,
                                             (void *) guc_variables,
                                             num_guc_variables,
                                             sizeof(struct config_generic *),
                                             guc_var_compare);

while guc_var_compare() assume it's being passed a full config_generic:

static int
guc_var_compare(const void *a, const void *b)
{
    const struct config_generic *confa = *(struct config_generic *const *) a;
    const struct config_generic *confb = *(struct config_generic *const *) b;
    return guc_name_compare(confa->name, confb->name);
}


which several versions of gcc then complain about:

In function ‘guc_var_compare’,
    inlined from ‘bsearch’ at /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h:33:23,
    inlined from ‘find_option’ at /home/andres/src/postgresql-15/src/backend/utils/misc/guc.c:5640:35:
/home/andres/src/postgresql-15/src/backend/utils/misc/guc.c:5727:38: warning: array subscript ‘const struct
config_generic[0]’is partly outside array bounds of ‘const char[8]’ [-Warray-bounds=]
 
 5727 |         return guc_name_compare(confa->name, confb->name);
      |                                 ~~~~~^~~~~~
/home/andres/src/postgresql-15/src/backend/utils/misc/guc.c: In function ‘find_option’:
/home/andres/src/postgresql-15/src/backend/utils/misc/guc.c:5627:25: note: object ‘name’ of size 8
 5627 | find_option(const char *name, bool create_placeholders, bool skip_errors,


Which seems entirely legitimate. ISTM that guc_var_compare() ought to only
cast the pointers to the key type, i.e. char *.  And incidentally that does
prevent the warning.

The reason it doesn't happen in newer versions of postgres is that we aren't
using guc_var_compare() in the relevant places anymore...

Greetings,

Andres Freund



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Matthias van de Meent
Дата:
Сообщение: Re: Statistics Import and Export
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Cleanup: remove unused fields from nodes