libev, забавное
Apr. 28th, 2012 01:58 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
В бабуинанедолбеанедебиане gcc -O2 при компиляции примера работы с libev кидает кучу warnings типа "testev.c:58: warning: dereferencing type-punned pointer will break strict-aliasing rules"
Автор на вопросы на эту тему псит, как команда из 100500 айседов и авторов firebird вместе взятых, в стиле "вы тупые, используйте компилятор C для компиляции C, идите нахрен, это всего лишь warning".
http://comments.gmane.org/gmane.comp.lib.ev/907
http://lists.schmorp.de/pipermail/libev/2010q1/000912.html
собственно патчик: http://lists.schmorp.de/pipermail/libev/attachments/20100218/3c4aaf8c/attachment.txt
Автор на вопросы на эту тему псит, как команда из 100500 айседов и авторов firebird вместе взятых, в стиле "вы тупые, используйте компилятор C для компиляции C, идите нахрен, это всего лишь warning".
http://comments.gmane.org/gmane.comp.lib.ev/907
http://lists.schmorp.de/pipermail/libev/2010q1/000912.html
собственно патчик: http://lists.schmorp.de/pipermail/libev/attachments/20100218/3c4aaf8c/attachment.txt
no subject
Date: 2012-04-28 11:05 am (UTC)Это, типа, предыдущий вопрос так развился?
no subject
Date: 2012-04-28 11:06 am (UTC)no subject
Date: 2012-04-28 11:32 am (UTC)Сишный код должен компилироваться с -Wall -Werror (И желательно не только gcc, но и clang'ом тоже)
no subject
Date: 2012-04-28 11:35 am (UTC)Но даже тогда gcc ловит не всё.
no subject
Date: 2012-04-28 11:49 am (UTC)Те которые "строят модэл" или "по списку известных тараканов мы вам предъявим обвинения".
no subject
Date: 2012-04-28 12:04 pm (UTC)no subject
Date: 2012-04-28 01:22 pm (UTC)Но, например, VLA не допустимы ни в какой версии C++, а g++ их пропускает даже с педантиком.
no subject
Date: 2012-04-28 01:24 pm (UTC)Пробовал, но там сюжет запутанный и действующих лиц много, как в телефонном справочнике.
> VLA не допустимы ни в какой версии C++, а g++ их пропускает даже с педантиком.
А, если про это, тогда да.
no subject
Date: 2012-04-28 01:26 pm (UTC)no subject
Date: 2012-04-28 01:39 pm (UTC)no subject
Date: 2012-04-28 01:40 pm (UTC)no subject
Date: 2012-04-28 01:44 pm (UTC)Вот про "не читали" не нужно было.
no subject
Date: 2012-04-28 01:45 pm (UTC)no subject
Date: 2012-04-28 01:51 pm (UTC)no subject
Date: 2012-04-28 01:56 pm (UTC)no subject
Date: 2012-04-28 02:28 pm (UTC)In C mode, this is equivalent to -std=c90. In C++ mode, it is
equivalent to -std=c++98.
no subject
Date: 2012-04-28 01:43 pm (UTC)no subject
Date: 2012-04-28 02:15 pm (UTC)no subject
Date: 2012-04-28 12:29 pm (UTC)no subject
Date: 2012-04-28 01:23 pm (UTC)no subject
Date: 2012-04-28 01:05 pm (UTC)А у автора libev ебанутый code style. Какие-то многоуровневые typedef'ы и тонны макросов.
no subject
Date: 2012-04-28 01:12 pm (UTC)Я там весь тред прочитал, автор невменяем, причину warning пока я не понял.
макрос раскрывается в конструкцию:
do {
((ev_watcher *)(void *)(&stdin_watcher))->active =
((ev_watcher *)(void *)(&stdin_watcher))->pending = 0;
((ev_watcher *)(void *)((&stdin_watcher)))->priority = (0);
((&stdin_watcher))->cb = (stdin_cb);
} while (0);
((ev_watcher *)(void *)(&stdin_watcher)) упорно вызывает warning, хотя вроде компилятору явно указано, что такие наши намерения.
no subject
Date: 2012-04-28 01:29 pm (UTC)И, да, gcc'шная эвристика бывает сбоит. False positive warning на тему strict aliasing случается.
no subject
Date: 2012-04-28 01:39 pm (UTC){
int active; int pending; int priority; void *data;
void (*cb)(struct ev_loop *loop, struct ev_watcher *w, int revents);
} ev_watcher;
typedef struct ev_watcher_list
{
int active; int pending; int priority; void *data;
void (*cb)(struct ev_loop *loop, struct ev_watcher_list *w, int revents);
struct ev_watcher_list *next;
} ev_watcher_list;
typedef struct ev_io
{
int active; int pending; int priority; void *data;
void (*cb)(struct ev_loop *loop, struct ev_io *w, int revents);
struct ev_watcher_list *next;
int fd;
int events;
} ev_io;
((ev_watcher *) (void *) (&watcher))->active=17; - показывает warning
собственно, эвристика формально права - структуры разные(т.к. определены в ev.h через развертывание макросов, а не вложение одной структуры в другую.
no subject
Date: 2012-04-28 02:01 pm (UTC)no subject
Date: 2012-04-28 01:33 pm (UTC)no subject
Date: 2012-04-28 01:42 pm (UTC)no subject
Date: 2012-04-28 01:45 pm (UTC)no subject
Date: 2012-04-28 02:20 pm (UTC)no subject
Date: 2012-04-29 01:48 pm (UTC)причем, афаик еще в 2008-й студии такие оптимизации отсутствовали
(тем не менее, зачастую то что собирает последняя студия работает заметно шустрее того что собирает gcc)
проще не пытаться избавиться от ворнингов, а реально разобраться почему это компилятор считает что правила нарушены, в большинстве случаев эти ворнинги ошибочны
no subject
Date: 2012-04-29 03:07 pm (UTC)