The OpenNET Project / Index page

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

Как указать 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
Раздел:    Корень / Программисту и 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 (ok), 19:32, 23/10/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Из серии - плохой компилятор знает больше, чем хороший программист.
     
  • 1.5, Дима (??), 15:26, 24/10/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    идиотизм какой-то . В Java сделано лучше. Такой код просто не скомпилируется, т.к. по спецификации запрещено применять непроинициализированные локальные переменные
     
     
  • 2.6, Карбофос (ok), 15:56, 24/10/2009 [^] [^^] [^^^] [ответить]  
  • +/
    прежде, чем заявлять, что "в ява сделано лучше", нужно знать, какой код генерирует gcc
    кто тебе сказал, что бессмысленные выражения будут в бинарнике?
     
  • 2.7, pavlinux (ok), 18:50, 24/10/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >идиотизм какой-то . В Java сделано лучше. Такой код просто не скомпилируется,
    >т.к. по спецификации запрещено применять непроинициализированные локальные переменные

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

     
  • 2.11, Аноним (-), 21:43, 05/09/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Алё, Дима, ты где здесь "непроинициализированные локальные переменные" увидел? Иди портфель собирай, критик юный.
     

  • 1.8, pavlinux (ok), 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:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру