Странность с va_copy
Dec. 9th, 2018 09:28 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вот такую странную картину я тут наблюдаю:
Debian testing, gcc 8.2.0. Имеется вот такой C-шный код:
В 64-битной системе компилятор кушает этот код без вопросов. В 32-битной ругается
error: ‘std_args’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
vfprintf(stderr, fmt, std_args);
Нет, я понимаю, что макросы для va_* могут быть реализованы по разному в зависимости от архитектуры процессора, но не до такой же степени...
Debian testing, gcc 8.2.0. Имеется вот такой C-шный код:
static void log (int elevel, const char *fmt, va_list args) { bool write_to_file, write_to_stderr, write_somewhere_else; va_list error_args, std_args; .... здесь вычисляем куда надо писать if (write_to_file && write_to_stderr) va_copy(std_args,args); .... некоторое количество кода, заведомо не меняющего флагов write_to if (write_to_file) { vfprintf(f,fmt, args); } if (write_to_stderr) { if (write_to_file) { vfprintf(stderr, fmt, std_args); } else { vfprintf(stderr,fmt,args); } ffush(stderr); }
В 64-битной системе компилятор кушает этот код без вопросов. В 32-битной ругается
error: ‘std_args’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
vfprintf(stderr, fmt, std_args);
Нет, я понимаю, что макросы для va_* могут быть реализованы по разному в зависимости от архитектуры процессора, но не до такой же степени...
no subject
Date: 2018-12-10 07:09 am (UTC)У меня было как-то ещё в эпоху PDP-11 и "Ленинградского Си" анекдотическое.
if (условие) функция();
компилировалось в какой-то махровый бред, ибо функция была на самом деле чуть криво написанным макросом, результат раскрытия которого частично "выпадал" из блока условия.
if (условие) { функция(); }
компилировалось как ожидалось и работало правильно.
no subject
Date: 2018-12-10 07:24 am (UTC)no subject
Date: 2018-12-10 08:22 am (UTC)А vfprintf вообще не макрос.
Еще интереснее - результат препроцессирования данной функции в 32-битной среде (где ругается) и в 64-битной) вообще никак не различается.
no subject
Date: 2018-12-10 09:04 am (UTC)no subject
Date: 2018-12-10 09:19 am (UTC)И макрос не такой уж развесистый.
no subject
Date: 2018-12-10 10:14 am (UTC)К счастью, конфликтов, когда в одних контекстах надо бы окружать фигурными скобками, а в других - круглыми, в Си не бывает. По крайней мере, я таких примеров не встречал.
no subject
Date: 2018-12-10 10:16 am (UTC)no subject
Date: 2018-12-10 10:19 am (UTC)Ну и вообще врождённых болезней у языка препроцессора много :)
no subject
Date: 2018-12-10 10:54 am (UTC)Ну каноническое решение против else выглядит как
no subject
Date: 2018-12-10 11:01 am (UTC)no subject
Date: 2018-12-10 11:06 am (UTC)no subject
Date: 2018-12-11 02:35 am (UTC)