__attribute__ ((warn_unused_result)) 不会为 shared_ptr 产生警告
__attribute__ ((warn_unused_result)) does not produce warnings for shared_ptr
注意:在下面添加了示例并在关于再现性的评论后更新了标题。
我们正在尝试通过为我们的函数提供属性来改进我们的代码库。
在一些函数上我们添加了属性:
__attribute__ ((warn_unused_result))
在某些时候,我们故意放置一些应该产生警告的代码,因为我们不使用该函数的结果。
例如
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,但这并没有告诉我为什么它不适用于 non-standard 功能。
作为四个我们的设置:
- 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)
任何帮助或指点将不胜感激。
此致,
简夏侯
这显然是 C++ 特有的编译器错误 present until GCC 6.3
和 fixed in GCC 7.1。升级 GCC 似乎是你的
唯一的解决方案。
注意:在下面添加了示例并在关于再现性的评论后更新了标题。
我们正在尝试通过为我们的函数提供属性来改进我们的代码库。
在一些函数上我们添加了属性:
__attribute__ ((warn_unused_result))
在某些时候,我们故意放置一些应该产生警告的代码,因为我们不使用该函数的结果。 例如
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,但这并没有告诉我为什么它不适用于 non-standard 功能。
作为四个我们的设置:
- 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)
任何帮助或指点将不胜感激。
此致, 简夏侯
这显然是 C++ 特有的编译器错误 present until GCC 6.3 和 fixed in GCC 7.1。升级 GCC 似乎是你的 唯一的解决方案。