metaclass: (Default)
[personal profile] metaclass
В бабуинанедолбеанедебиане 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

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

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

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

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

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 31st, 2025 12:53 pm
Powered by Dreamwidth Studios