Почему Clang не генерирует никаких предупреждений о несовместимом кастинге?

Я пытаюсь скомпилировать простой код с помощью gcc и clang. gcc выдает предупреждение о несравненном приведении (отлично!). Однако clang не выдал никаких предупреждений! Я передал одни и те же аргументы для обоих:

cc -Wall -Wextra tmp3.c
gcc -Wall -Wextra tmp3.c

Я передаю все необходимые параметры компилятору clang или что-то упускаю? Clang документация не поможет!

Код:

int main(void)
{
    void *b = (void *)0x12345678;
    int   a = (int)(unsigned long)b;
    int   c = (int)b;
    return a + c;
}

Клэнг версии 3.8


person DJJ    schedule 16.07.2017    source источник
comment
Почему вы ожидаете, что clang выдаст предупреждение?   -  person Siguza    schedule 16.07.2017
comment
Лучший способ найти предупреждения, о которых вы, возможно, не знаете, — это -Weverything. Эта опция (к сожалению, только на Clang) включает буквально каждое предупреждение. Вы правы, документация не очень полезна.   -  person Kyle Strand    schedule 16.07.2017
comment
@Siguza: Почему бы и нет? Это самая фундаментальная вещь в любом компиляторе для любого языка программирования — предупреждение о несовместимом приведении!   -  person DJJ    schedule 16.07.2017
comment
@KyleStrand: я не знал о -Weverything, спасибо, что поделились. Он не выдал необходимого предупреждения, а вместо этого выдал мне: tmp3.c:7:2: warning: no newline at end of file [-Wnewline-eof] Так впечатлил clang!   -  person DJJ    schedule 16.07.2017
comment
@DavidJohn Я бы согласился как с несовместимыми назначениями, так и со всем, что явно неправильно, но приведения часто не являются ни тем, ни другим, как показывает единственная потребность в (int)(unsigned long). При явном приведении типов вы фактически сообщаете компилятору, что знаете, что делаете.   -  person Siguza    schedule 16.07.2017
comment
@Сигуза поняла. Если я добавлю (int)(unsigned long), то я скажу компилятору, что знаю, что делаю. Однако, если я преобразую 64-битное значение в 32-битное (без каких-либо подсказок компилятору), я ожидаю, что компилятор предупредит меня. В любом случае, мой вопрос заключался в том, есть ли способ заставить clang генерировать предупреждение для этой ситуации или нет?   -  person DJJ    schedule 16.07.2017
comment
Поскольку вы попробовали -Weverything, теперь вы можете сами ответить на свой вопрос (и пометить его как принятый).   -  person Kyle Strand    schedule 25.07.2017


Ответы (1)


Я связался с разработчиками clang (список рассылки). Я получил этот ответ:

В режиме C++ ошибки Clang на линии, как и у всех остальных. Однако в режиме C преобразования обычно более либеральны. В этом случае я подозреваю, что Clang также должен генерировать это предупреждение. Однако, вероятно, потребуется патч.

person DJJ    schedule 28.07.2017