Есть ли в clang предупреждение «Интегральное постоянное переполнение»?

Рассмотрим следующие фрагменты:

short x = 2000000000;

short x = (short)2000000000;

int x = 1000000000 * 1000000000;

Можем ли мы получить предупреждение (/ошибку) для них в Clang? Как? Начиная с какой версии?

Спасибо, Киприан.


person MciprianM    schedule 13.01.2014    source источник


Ответы (1)


По крайней мере, начиная с clang 3.3, вы получаете предупреждения в обоих случаях, даже не пытаясь:

/* main.c */
short x = 2000000000;
int y = 1000000000 * 1000000000;

int main()
{
    return 0;
}

Скомпилировать:

$ clang -c main.c
main.c:1:11: warning: implicit conversion from 'int' to 'short' changes value
      from 2000000000 to -27648 [-Wconstant-conversion]
short x = 2000000000;
      ~   ^~~~~~~~~~
main.c:2:20: warning: overflow in expression; result is -1486618624 with type
      'int' [-Winteger-overflow]
int y = 1000000000 * 1000000000;
                   ^
2 warnings generated.
person Mike Kinghan    schedule 13.01.2014
comment
Спасибо, это отличный ответ. Не могли бы вы добавить, какие предупреждающие флаги вы использовали? Также не могли бы вы добавить, что происходит, когда вы выполняете явное приведение типов, например short x = (short) 2000000000; ? Я отредактирую свой вопрос, чтобы включить этот случай. Спасибо! - person MciprianM; 20.01.2014
comment
$ clang -c main.c — это команда компиляции. Предупреждающих флагов нет. (short) 2000000000 не вызовет предупреждения о неявном преобразовании, потому что преобразование в этом случае является явным: приведение означает Просто сделайте это. - person Mike Kinghan; 21.01.2014