__attribute__ ((warn_unused_result)) не выдает предупреждений для shared_ptr - PullRequest
0 голосов
/ 29 августа 2018

Примечание: добавлен пример ниже и обновлен заголовок после комментария о воспроизводимости.

Мы пытаемся улучшить нашу кодовую базу, предоставляя атрибуты нашим функциям.

для некоторых функций мы добавили атрибут:

__attribute__ ((warn_unused_result))

В некоторые моменты мы намеренно помещаем некоторый код, который должен выдавать предупреждение, поскольку мы не используем результат функции. например, * +1008 *

shared_ptr<type> functionName() __attribute__ ((warn_unused_result));
functionName(); // this should produce a warning

Однако предупреждения не выдаются. Являются ли эти предупреждения подавленными по умолчанию или существуют другие зависимости, которые могут помочь в работе.

Я нашел некоторую информацию здесь: https://www.linuxquestions.org/questions/programming-9/gcc-warn_unused_result-attribute-917158 через Google, но это не указывает мне, почему он не работает для нестандартных функций.

Как четыре наши установки:

  • g ++ версия 4.9.2
  • Версия Debian 8.6
  • включены флаги предупреждения при сборке:

    -Wall -Wextra -Wconversion -Wshadow -Weffc++
    

Вот пример, который воспроизводит эту проблему:

#include <iostream>
#include <memory>

std::shared_ptr<std::string> function(int b) __attribute__ ((warn_unused_result));
int other(int b) __attribute__ ((warn_unused_result));

int main()
{
  auto lResult = function(3); // not expect warning
  std::cout << lResult->c_str() << " is the result" << std::endl;

  std::cout << function(4)->c_str() << " is the result too." << std::endl; // not expect warning

  function(5); // expect warning but this warning is not given.

  auto lOther = other(3); // not expect warning
  std::cout << lOther << " is the result" << std::endl;

  std::cout << other(4) << " is the result too." << std::endl; // not expect warning

  other(5); // expect warning and it is given.


  return 0;
}

std::shared_ptr<std::string> function(int b)
{
  auto lString = std::make_shared<std::string>("::" + std::to_string(b) + "::");

  return lString;
}

int other(int b)
{
  return 5 * b;
}

и CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project(ShowCase)

add_definitions("-std=c++14")

set(CMAKE_CXX_FLAGS_MINSIZEREL "-Wall -Wextra -Wconversion -Wshadow -Weffc++")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -Wall -Wextra -Wconversion -Wshadow -Weffc++")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -Wall -Wextra -Wconversion -Wshadow -Weffc++ ")
set(CMAKE_CXX_FLAGS_DEBUG  "-g -Wall -Wextra -Wconversion -Wshadow -Weffc++")

add_executable(ShowCase main.cpp)

Любая помощь или указатели будут очень признательны.

С уважением, Ян Яап

1 Ответ

0 голосов
/ 29 августа 2018

Это, очевидно, ошибка компилятора, специфичная для C ++, которая присутствует до GCC 6.3 и исправлено в GCC 7.1 . Обновление GCC, похоже, будет вашим Единственное решение.

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