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
Автор на вопросы на эту тему псит, как команда из 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
Это, типа, предыдущий вопрос так развился?
no subject
no subject
Сишный код должен компилироваться с -Wall -Werror (И желательно не только gcc, но и clang'ом тоже)
no subject
Но даже тогда gcc ловит не всё.
no subject
Те которые "строят модэл" или "по списку известных тараканов мы вам предъявим обвинения".
no subject
no subject
Но, например, VLA не допустимы ни в какой версии C++, а g++ их пропускает даже с педантиком.
no subject
Пробовал, но там сюжет запутанный и действующих лиц много, как в телефонном справочнике.
> VLA не допустимы ни в какой версии C++, а g++ их пропускает даже с педантиком.
А, если про это, тогда да.
no subject
no subject
no subject
no subject
Вот про "не читали" не нужно было.
no subject
no subject
no subject
no subject
In C mode, this is equivalent to -std=c90. In C++ mode, it is
equivalent to -std=c++98.
no subject
no subject
no subject
no subject
no subject
А у автора libev ебанутый code style. Какие-то многоуровневые typedef'ы и тонны макросов.
no subject
Я там весь тред прочитал, автор невменяем, причину 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
И, да, gcc'шная эвристика бывает сбоит. False positive warning на тему strict aliasing случается.
no subject
{
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
no subject
no subject
no subject
no subject
no subject
причем, афаик еще в 2008-й студии такие оптимизации отсутствовали
(тем не менее, зачастую то что собирает последняя студия работает заметно шустрее того что собирает gcc)
проще не пытаться избавиться от ворнингов, а реально разобраться почему это компилятор считает что правила нарушены, в большинстве случаев эти ворнинги ошибочны
no subject