LINUX.ORG.RU

-Wunused-value не работает


0

0
struct CTest
{
	char payload[1024];
	int * ptr;
};

CTest test()
{
	static char seed=0;
	CTest a = { {seed++}, new int };
	return a;
}


int main(){
  test(); //Где мой ворнинг???
  return 0;
}
[legolegs@battlehummer ~]$ g++ -Wall -Wextra -std=c++0x -Wunused-value  test.cpp
[legolegs@battlehummer ~]$
★★★★★

А должно? Тут скорее неинициализированная переменная и неиспользование возвращаемого значения.

l5k
()
Ответ на: комментарий от legolegs

неиспользование возвращаемого значения.

А сабж - это разве не оно?

--unsed-value ругается на код вида:

int fn()
{
  1;  // warning: statement has no effect
}
ХЗ почему так, похоже всем это нравится.

В gcc есть Function Attributes, а среди них:

warn_unused_result The warn_unused_result attribute causes a warning to be emitted if a caller of the function with this attribute does not use its return value. This is useful for functions where not checking the result is either a security problem or always a bug, such as realloc.

              int fn () __attribute__ ((warn_unused_result));
              int foo ()
              {
                if (fn () < 0) return -1;
                fn ();
                return 0;
              }

results in warning on line 5.

l5k
()
Ответ на: комментарий от l5k

warn_unused_result

Да хрен там:

struct CTest
{
	char payload[1024];
	int * ptr;
};

CTest  test() __attribute__ ((warn_unused_result));
CTest  test()
{
	static char seed=0;
	CTest a = { {seed++}, new int };
	return a;
}


int main(){
  test();
  return 0;
}

Никаких ворнингов.

legolegs ★★★★★
() автор топика
Ответ на: warn_unused_result от legolegs

Хмм.. кажись снова цепепе показал себя с хорошой стороны, либо в этом какой-то глубокий смысл. Присоединяюсь к вопросу и так же вопрошаю коллективный разум.

К сведению, g++45 (GCC) 4.5.0 20091217 (experimental) тоже молчит, но откликается на всякое POD-ное. %(

l5k
()
Ответ на: комментарий от l5k

Эта структура является POD-типом.

Мне кажется, что это баг g++, связанный с наличием автоматически генерируемого конструктора копирования. По крайней мере, если ручками его дописать, то варнинг появляется. Очевидно, надо писать багрепорты.

linuxfan
()
Ответ на: комментарий от linuxfan

если ручками его дописать, то варнинг появляется

Как правильно дописывать?

struct CTest
{
	char payload[1024];
	int * ptr;
	CTest & operator=(const CTest & other) {ptr = other.ptr; return *this;};
};

Варнинг не появляется.

legolegs ★★★★★
() автор топика
Ответ на: комментарий от legolegs

Как правильно дописывать?

o_O

C++ только на картинках видел чтоли?

struct CTest 
{ 
   char payload[1024]; 
   int * ptr; 
   CTest (const CTest &other) : ptr(other.ptr) {}
};
linuxfan
()
Ответ на: комментарий от linuxfan

Тфу блин. Прочитал «конструктор» как «оператор». Надо русский подучить.

legolegs ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.