Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Компилятор C и "precision loss"  (Прочитано 8667 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« : 30-09-2008 09:16 » 

Здравствуйте, коллеги.

Может вопрос покажется глупым, но ответа на него я не знаю Улыбаюсь
Не могли бы вы мне помочь?

Простая программка:

Код:
int main (int argc, char **argv)
{
  unsigned long a = 0xFF0000FE;
  unsigned short b = a + 1;
  return 0;
}

В строке  "unsigned short b = a + 1;"  происходит потеря данных из-за несовпадения размерности типов. В MSVC такая ситуация ловится включением уровня 3 для предупреждений - /W3

А как такое сделать в GCC? Я второй день изучаю документацию и складывается впечатление, что GCC такого просто не умеет и такие ситуации не распознает.

Спасибо.
Записан
zeo
Интересующийся

ru
Offline Offline
Пол: Мужской
Челябинск, Россия


« Ответ #1 : 30-09-2008 11:37 » 

Монжно включить максимальный уровень предупреждений опцией -Wall
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #2 : 30-09-2008 11:43 » 

zeo, а сами то пробовали?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 30-09-2008 12:32 » 

Нет таких параметров. Есть опции только для плавающих значений.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 30-09-2008 12:37 » 

zeo, спасибо. Но, к сожалению, -Wall не максимальный уровень. Название "all" только вводит в заблуждение. Есть еще, например, -Wextra, а есть опции, которые вообще не входят ни туда, ни туда.

RXL, спасибо. Мне казалось наличие такого предупреждения довольно логичным. Видимо, у разработчиков GCC были причины на то, чтобы не вводить такой параметр.
Записан
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 17-10-2008 12:47 » 

Подумал, может, кому интересно.

Не прошло и 25 лет, как разработчики GCC все таки прониклись пользой отслеживания размерности типов. Начиная с версии 4.3 (первый релиз вышел в марте 2008) GCC умеет распознавать и сообщать о ситуациях с присваиманием из long в char и им подобных.

Опция -Wconversion, которая работала только для fixed и floating point теперь разделена на две опции -Wtraditional-conversion и -Wconversion.

Подробности можно почитать здесь http://gcc.gnu.org/wiki/NewWconversion

Я проверил - на приведенный пример ругается "warning: conversion to ‘short unsigned int’ from ‘long unsigned int’ may alter its value".
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #6 : 17-10-2008 12:57 » 

mczim@mczim-desktop:~/tmp$ gcc -Wtraditional-conversion main.cpp
cc1plus: ошибка: некорректный ключ "-Wtraditional-conversion"

mczim@mczim-desktop:~/tmp$ gcc -Wconversion main.cpp
нет ошибок.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 17-10-2008 13:15 » 

McZim, какая версия GCC?

Я проверял 4.3.2, сегодня выгрузил из SVN и собрал - все работает, как описано в wiki-статье.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #8 : 20-10-2008 06:09 » 

gcc-4.2
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines