metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-04-28 01:58 pm

libev, забавное

В бабуинанедолбеанедебиане 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

[identity profile] kiryl.livejournal.com 2012-04-28 01:05 pm (UTC)(link)
Патчик говно. Он только прячет warning.

А у автора libev ебанутый code style. Какие-то многоуровневые typedef'ы и тонны макросов.

[identity profile] metaclass.livejournal.com 2012-04-28 01:12 pm (UTC)(link)
Патч да, кривой.
Я там весь тред прочитал, автор невменяем, причину 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, хотя вроде компилятору явно указано, что такие наши намерения.

[identity profile] kiryl.livejournal.com 2012-04-28 01:29 pm (UTC)(link)
Какого типа stdin_watcher? Про strict aliasing rules в курсе?

И, да, gcc'шная эвристика бывает сбоит. False positive warning на тему strict aliasing случается.

[identity profile] metaclass.livejournal.com 2012-04-28 01:39 pm (UTC)(link)
typedef struct ev_watcher
{
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 через развертывание макросов, а не вложение одной структуры в другую.

[identity profile] kiryl.livejournal.com 2012-04-28 02:01 pm (UTC)(link)
Реальной проблемы тут не будет. Проще всего "пофиксить" с -fno-strict-aliasing, раз писать нормально не умеет.