Странность в GCC или всё-таки нет?

Модератор: Модераторы разделов

aniily
Сообщения: 64

Странность в GCC или всё-таки нет?

Сообщение aniily »

Добрый день, друзья!

Вот тут отлавливал багу и наткнулся на такой вот интересный случай.
Допустим имеем следующий код:

Код: Выделить всё

#include <stdint.h>


int main(void)
{
    const    int16_t    big = 0x1F67;
    int8_t    small;

    small = big;
    return 0;
}


Как видно, имеет место потеря старшего байта, что возможно является ошибкой в программе. Разумно программисту явно указать приведение типов.
Если компилим его командой gcc -Wall test.c, то всё собирается без каких-либо предупреждений.

Если же собирать его командой g++ -Wall test.c, то выдаётся предупреждение
warning: overflow in implicit constant conversion

Неужели в Си не должно быть тоже предупреждения?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Странность в GCC или всё-таки нет?

Сообщение eddy »

aniily писал(а):
03.08.2010 11:45
Неужели в Си не должно быть тоже предупреждения?

И на каждый вызов getc/getchar и им подобных, на каждое неявное преобразование типов получать warning?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
aniily
Сообщения: 64

Re: Странность в GCC или всё-таки нет?

Сообщение aniily »

eddy писал(а):
03.08.2010 12:11
aniily писал(а):
03.08.2010 11:45
Неужели в Си не должно быть тоже предупреждения?

И на каждый вызов getc/getchar и им подобных, на каждое неявное преобразование типов получать warning?

Хм.... а зачем вообще getchar возвращает int, когда на самом деле от него больше 255 не получить? Если введён символ с многобайтным кодом, то вызов возвращает только один байт.
Спасибо сказали:
AlexBel
Сообщения: 27

Re: Странность в GCC или всё-таки нет?

Сообщение AlexBel »

aniily писал(а):
07.08.2010 20:01
Хм.... а зачем вообще getchar возвращает int, когда на самом деле от него больше 255 не получить? Если введён символ с многобайтным кодом, то вызов возвращает только один байт.

потому-что кроме 256 значений, которые помещаются в 8 бит, функция getchar еще должна возвращать EOF.

http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%...D0.B0.C2.BB_EOF
Спасибо сказали:
aniily
Сообщения: 64

Re: Странность в GCC или всё-таки нет?

Сообщение aniily »

AlexBel писал(а):
07.08.2010 20:27
aniily писал(а):
07.08.2010 20:01
Хм.... а зачем вообще getchar возвращает int, когда на самом деле от него больше 255 не получить? Если введён символ с многобайтным кодом, то вызов возвращает только один байт.

потому-что кроме 256 значений, которые помещаются в 8 бит, функция getchar еще должна возвращать EOF.

http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%...D0.B0.C2.BB_EOF


Тогда получается, что действительно нужно брать переменную типа int, а не char. И тогда можно избежать этой типичной ошибки, и если бы был warning, то это бы на то указывало. Нет?
Спасибо сказали:
AlexBel
Сообщения: 27

Re: Странность в GCC или всё-таки нет?

Сообщение AlexBel »

для того что-бы было предупреждение при компиляции gcc, нужно указать опцию -Wconversion
Спасибо сказали:
aniily
Сообщения: 64

Re: Странность в GCC или всё-таки нет?

Сообщение aniily »

AlexBel писал(а):
07.08.2010 21:36
для того что-бы было предупреждение при компиляции gcc, нужно указать опцию -Wconversion

Спасибо, AlexBel. Это конкретно то, что я искал. =) Просто удивился, что при -Wall он этот warning не выдаёт. А если есть отдельный ключ для включения этого warning, то это совершенно другое дело. Ещё раз спасибо.
Спасибо сказали: