The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Как указать GCC выводить предупреждения для бессмысленных сравнений
При сборке ниже представленного некорректного кода, gcc не выдает никаких
предупреждений даже с -Wall, при этом указатель он приводит к unsigned, поэтому
результат сравнения всегда ложен.

   if ((fp = fopen(file, "w")) < 0)

Если написать:

   unsigned int a;
   if (a < 0)
   return 1;
   return 0;


gcc опять не ругается и даже с -O0 генерирует код, который не делает никаких
сравнений, а сразу возвращает результат. То есть знает, что сравнение
бессмысленное, но молчит.

Для того, чтобы gcc начал выводить предупреждения нужно указать -Wextra, тогда буде выведено:

   warning: comparison of unsigned expression < 0 is always false

Вариант 2 (правильный):

   $ gcc -std=c99 -W
 
21.10.2009 , Автор: Kir Kolyshkin , Источник: http://k001.livejournal.com/725123....
Ключи: gcc, compiler, debug, warning / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / C/C++, сборка, отладка

Обсуждение [ RSS ]
 
  • 1.1, anon, 12:15, 23/10/2009 [ответить] [смотреть все]
  • +/
    СТОП! А как мне заставить ГЦЦ скомпилить такое "бессмысленное сравнение" там, где это надо???
     
     
  • 2.2, анон, 12:19, 23/10/2009 [^] [ответить] [смотреть все]
  • +/
    Иногда бывает нужно при написании антиотладки, анти-аверов и т.д.
     
  • 2.3, Аноним, 12:23, 23/10/2009 [^] [ответить] [смотреть все]
  • +/
    При -fno-delete-null-pointer-checks такое сработает ?
     
  • 1.4, pavlinux, 19:32, 23/10/2009 [ответить] [смотреть все]
  • +/
    Из серии - плохой компилятор знает больше, чем хороший программист.
     
  • 1.5, Дима, 15:26, 24/10/2009 [ответить] [смотреть все]
  • +/
    идиотизм какой-то . В Java сделано лучше. Такой код просто не скомпилируется, т.к. по спецификации запрещено применять непроинициализированные локальные переменные
     
     
  • 2.6, Карбофос, 15:56, 24/10/2009 [^] [ответить] [смотреть все]  
  • +/
    прежде, чем заявлять, что "в ява сделано лучше", нужно знать, какой код генерирует gcc
    кто тебе сказал, что бессмысленные выражения будут в бинарнике?
     
  • 2.7, pavlinux, 18:50, 24/10/2009 [^] [ответить] [смотреть все]  
  • +/
    >идиотизм какой-то . В Java сделано лучше. Такой код просто не скомпилируется,
    >т.к. по спецификации запрещено применять непроинициализированные локальные переменные

    s/непроинициализированные/не инициализированные/\g;

     
  • 2.11, Аноним, 21:43, 05/09/2015 [^] [ответить] [смотреть все]  
  • +/
    Алё, Дима, ты где здесь непроинициализированные локальные переменные увидел И... весь текст скрыт [показать]
     
  • 1.8, pavlinux, 19:29, 24/10/2009 [ответить] [смотреть все]  
  • +/
    >[оверквотинг удален]
    >   return 1;
    >   return 0;
    >
    >
    >gcc опять не ругается и даже с -O0 генерирует код, который не
    >делает никаких сравнений, а сразу возвращает результат. То есть знает, что
    >сравнение бессмысленное, но молчит.
    >
    >Для того, чтобы gcc начал выводить предупреждения нужно указать -Wextra, тогда буде
    >выведено:

    ISO/ICE9899  стр. 44 на предмет разницы unsigned в K&R, C89 и С99

    Так что

    # gcc -std=c99 -W -Werror test.c

    И будет вам счастье, специально для программеров на Жаве, добавляем -Werror.
    За Вас, жавероф, Sun Microsystem уже подумал, тут надо самим. :)

      

     
  • 1.9, Саша, 21:25, 26/10/2009 [ответить] [смотреть все]  
  • +/
    как с меня прикольная заметка :)
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor