Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GCC варнинги компиляции, отключение конкретных варнингов 
V
    Опции темы
shara
Дата 6.6.2013, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



Приветствую

собсно вопрос, 
есть ли в GCC способ "програмно" отключить некоторые из варнингов компиляции?

по принципу как в M$VC

Код

#pragma warning( disable : <номер предупреждения> )


собсно варниг на который ругаицца 
Код

warning: the address of ‘some_variable_name’ will never be NULL [-Waddress]


В данном конкретном случае варнинг не имеет смысла. Но хочется оставить такую проверку для остальных частей проекта..


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
borisbn
Дата 6.6.2013, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Лови - http://forum.vingrad.ru/forum/topic-350156...y2500255/0.html - я уже спрашивал именно это. Мне помогли


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
shara
Дата 10.6.2013, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



Спасибо помогло  smile 
Код

#pragma GCC diagnostic ignored "-Waddress"
//some warning code here
#pragma GCC diagnostic warning "-Waddress"



--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
borisbn
Дата 10.6.2013, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



а ещё лучше будет збавиться от этого
Цитата(shara @  10.6.2013,  11:54 Найти цитируемый пост)
//some warning code here

 smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
shara
Дата 10.6.2013, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



иногда просто нет возможности избавиться от этого.

Пример из реального проекта:
Код

    /**
     *  General purpose buffer structure
     */
    typedef struct _sdrm_buff{
        Byte* data;  /**< Pointer to the buffer data */
        Uint32 sz;    /**< Data size */
    }Buffer;

#define INIT_BUFFER_FROM_RAW(b, pr, rs) do{\
    (b).data = NULL; \
    (b).sz = 0; \
    if (NULL != (pr)) {\
        MALLOC_BUFFER(b, (rs)); \
        if((b).data != NULL) \ // вот тут ругаицца
        { \
            memcpy((b).data,(pr),(rs));\
        } \
    }\
}while(0)

.....

  Buffer devSecLevel = {0};
  int      devSecLevelGetFromUser = getSomeInt()'

#pragma GCC diagnostic ignored "-Waddress"
   INIT_BUFFER_FROM_RAW(devSecLevel, &jdevSecLevel /* а вот тут обычно указатель */,   1 /* !!! */ );
#pragma GCC diagnostic warning "-Waddress"



--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
volatile
Дата 10.6.2013, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(shara @  10.6.2013,  12:17 Найти цитируемый пост)
if((b).data != NULL) \ // вот тут ругаицца


PM MAIL   Вверх
shara
Дата 11.6.2013, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



Цитата(volatile @  10.6.2013,  22:34 Найти цитируемый пост)
if((b).data != NULL) \ // вот тут ругаицца

 smile  

ИМХО вопрос вкуса. Видать автору так было наглядней\привычней
(и кстати компиллер все равно ругается)


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
borisbn
Дата 11.6.2013, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Уже с час сижу и не могу понять, почему компилятор ругается на проверку того, что некий указатель не равен NULL  smile 
Просветите, плиз.

Добавлено через 2 минуты и 11 секунд
Я бы ещё понял, если бы тут
Цитата(shara @  10.6.2013,  12:17 Найти цитируемый пост)
if (NULL != (pr)) {\

где pr это & jdevSecLevel, который, действительно, не м.б. NULL

Добавлено через 8 минут и 1 секунду
И ещё. ИМХО лучше избавиться не отключением warning'а (при чём компиляторозависимым), а так
Код

Buffer devSecLevel = {0};
...
// Седующая строчка ОБЯЗАТЕЛЬНА, чтобы тот, кто в будущем будет читать не ломал бы голову, зачем так сделано
// Создаём указатель, для того, чтобы избавиться от warning'а в макросе INIT_BUFFER_FROM_RAW
const Buffer * tempDevSecLevelPtr = & devSecLevel;
INIT_BUFFER_FROM_RAW( devSecLevel,  tempDevSecLevelPtr ... 



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 11.6.2013, 13:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(shara @  11.6.2013,  10:20 Найти цитируемый пост)
и кстати компиллер все равно ругается) 

Приведите минимальный вариант кода, который можно скомпилить и где он ругаецца. 

Цитата(shara @  11.6.2013,  10:20 Найти цитируемый пост)
if(b.data != NULL) \ // вот тут ругаицца

Если вы еще не забыли коммент убрать, то вообще замечательно.

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

PM MAIL   Вверх
shara
Дата 11.6.2013, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



Цитата(volatile @  11.6.2013,  12:48 Найти цитируемый пост)
Если вы еще не забыли коммент убрать, то вообще замечательно.

комент писан руками специально чтобы указать "проблемное" место. Не придирайтесь пожалуйста  

Цитата(volatile @  11.6.2013,  12:48 Найти цитируемый пост)
Приведите минимальный вариант кода, который можно скомпилить и где он ругаецца. 


Код

#include <stdio.h>
void main ()
{
  int a = 42;

  if (&a != NULL) {
    printf("&a will never be NULL");
  }
  else {
    printf("oh shit!");
  }
}

 простите, забыл сказать проект компилится с флагом -Wall (aka, хАчу все варнинги smile )
Код

user@ubuntu64:~/workspace/test$ gcc -Wall test.c -o test 
test.c:2:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
test.c: In function ‘main’:
test.c:6:9: warning: the comparison will always evaluate as ‘true’ for the address of ‘a’ will never be NULL [-Waddress]
user@ubuntu64:~/workspace/test$ ./test 
&a will never be NULL




Макрос   INIT_BUFFER_FROM_RAW, как несложно догадаться из названия, писан для того чтобы инитить Buffer общего типа некими данными, на которые указывать указатель  smile  (есесно мы должны знать размер этих данных)
Код  зашибисть работает. "проблемы" начались когда в этот самый буфер захотелось втолкать число, хранится в обыкновенном инте. Известно что инт обыкновенный создается на стеке, в следсвии чего его адрес никогда не будет нуль, о чем компилятор собсно и ругается. 

В общем,  вместо тысячи слов:
Код

#include <string.h>
#include <stdlib.h>

   //to make this staf compil
   typedef unsigned char Byte;
   typedef unsigned int  Uint32;

   /**
     *  General purpose buffer structure
     */
    typedef struct _buff{
        Byte* data;  /**< Pointer to the buffer data */
        Uint32 sz;   /**< Data size */
    }Buffer;

#define INIT_BUFFER_FROM_RAW(b, pr, rs) do{\
    (b).data = NULL; \
    (b).sz = 0; \
    if (NULL != (pr)) {\
        (b).sz = rs; \
        (b).data = malloc(rs); \
        if((b).data != NULL) \
        { \
            memcpy((b).data,(pr),(rs));\
        } \
    }\
}while(0)

int main (void)
{
/* p0 */
  Buffer devSecLevel0 = {0};
  char someData[] = "some random data, just lazy to write more code" ;

  INIT_BUFFER_FROM_RAW(devSecLevel0, someData,   sizeof(someData) ); // almost normal workflow


/* p1 */
  Buffer devSecLevel1 = {0};
  int    devSecLevelGotFromUser1 = 42;

  INIT_BUFFER_FROM_RAW(devSecLevel1, &devSecLevelGotFromUser1,   1 /* one byte */ ); // warning!!!

/* p2 */
  Buffer devSecLevel2 = {0};
  int    devSecLevelGotFromUser2 = 42;
  int  *pdevSecLevelGotFromUser2 = &devSecLevelGotFromUser2;

  INIT_BUFFER_FROM_RAW(devSecLevel2, pdevSecLevelGotFromUser2,   1 /* one byte */ ); // NO warning!
// IMHO it is better to make compiller shut up at this moment either than writing this sado-mazo code
  return 0;
}




Спасибо за внимание и время уделенное моей скромной персоне.


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
shara
Дата 11.6.2013, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



Цитата(borisbn @  11.6.2013,  09:40 Найти цитируемый пост)
И ещё. ИМХО лучше избавиться не отключением warning'а 

Чем лучше?
На вкус и цвет ИМХИ разные.
Вводить лишнюю переменную как-то лениво (и расточительно). Конечно умный кмопиллер это скорей всего с оптимизирует. Но быть может пускай он просто молча скомпилит код. Тем паче отключающая варнинг директива четко указывать на то что девелопер: 
первое как минимум смотрит варнинги
второе, подумал и решил отключить сей конкретный варнинг.

Вот представьте, вы читаете чужой код - а там не пойми зачем камасутру делают.. и у вас начинает вещество работать, думать, а зачем, а что,  а как? 
А так, взглянул в код и видно - не нужный варнинг подавлен. Аминь. 

Цитата(borisbn @  11.6.2013,  09:40 Найти цитируемый пост)
(при чём компиляторозависимым), а так

GCC наше все


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
borisbn
Дата 11.6.2013, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(shara @  11.6.2013,  19:59 Найти цитируемый пост)
Вот представьте, вы читаете чужой код - а там не пойми зачем камасутру делают.. и у вас начинает вещество работать, думать, а зачем, а что,  а как? 

Цитата(borisbn @  11.6.2013,  10:40 Найти цитируемый пост)
// Седующая строчка ОБЯЗАТЕЛЬНА, чтобы тот, кто в будущем будет читать не ломал бы голову, зачем так сделано
// Создаём указатель, для того, чтобы избавиться от warning'а в макросе INIT_BUFFER_FROM_RAW

Кста, я не случайно выделил слово ОБЯЗАТЕЛЬНО

Это сообщение отредактировал(а) borisbn - 12.6.2013, 00:32


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 11.6.2013, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



shara, вы это писали
Цитата(shara @  10.6.2013,  12:17 Найти цитируемый пост)
      if((b).data != NULL) \ // вот тут ругаицца
        

В этом месте он ругацца никак не может. Так что вы ввели в заблуждение и нас и себя.

Цитата(shara @  11.6.2013,  19:31 Найти цитируемый пост)
забыл сказать проект компилится с флагом -Wall 

Каждый сам выбирает себе крест, в меру своей параноидальности.
Вы его выбрали, ну так и несите с высоко поднятой головой.
borisbn, предложил вам использовать лишний указатель, имхо вполне нормальный выход, в вашем случае  smile 
Цитата(shara @  11.6.2013,  19:59 Найти цитируемый пост)
Вводить лишнюю переменную как-то лениво. 

Или вы хотите и рыбку съесть и палец о палец даже не ударить. smile 

И последнее, если вы все-же желаете вводить прагмы, то вы так и не привели пример того, где она не срабатывает.
Цитата(shara @  10.6.2013,  12:17 Найти цитируемый пост)
иногда просто нет возможности избавиться от этого.

где нет возможности то? Если в ваш код вставить
#pragma GCC diagnostic ignored "-Waddress",
варнингов не будет. Зачем вы тему второй раз подняли?

Это сообщение отредактировал(а) volatile - 11.6.2013, 23:48
PM MAIL   Вверх
shara
Дата 12.6.2013, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



Цитата(volatile @  11.6.2013,  22:41 Найти цитируемый пост)
В этом месте он ругацца никак не может. Так что вы ввели в заблуждение и нас и себя.

Да, не там коммент написал  smile 

Тему второй раз поднимать не хотел. Вы спрашивали я отвечал.. 

Свой ответ я получил во втором сообщении.
Все что ниже  - дискуссия о вкусах (с примесью моих опечаток) 

Всем спасибо  smile 


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1282 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.