为什么没有针对未使用临时性的gcc/g++警告
Why is there no gcc/g++ warning for unused temporaries?
考虑以下代码:
void ListenerImpl::attach(boost::shared_ptr<ISubscriber> subscriber)
{
boost::unique_lock<boost::mutex>(mtx);
subscribers.push_back(subscriber);
}
void ListenerImpl::notify(MsgPtr msg)
{
boost::unique_lock<boost::mutex>(mtx);
//notify all subscribers
BOOST_FOREACH(boost::shared_ptr<ISubscriber> subscriber, subscribers){
subscriber->update(msg);
}
}
(这是GoF中描述的观察器模式的实现。(这里的用户干预是为了保护attach((和notify((不同时运行,因此产生了boost::unique_lock。目标是保护subscribers
容器。
但确实很难注意到锁实际上只是临时的(仔细看,没有为它们指定名称(。因此,当临时对象被破坏时,互斥对象上的锁将立即释放,即代码不是线程安全的。在这种情况下,我希望编译器发出警告。类似于"未使用的临时"。
更糟糕的是,cppcheck也不会意识到这个错误。(cppcheck:一个c/c++代码分析工具http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page)
Gcc对未使用的变量发出警告。这里的临时变量是一个未使用的变量,肯定是程序员疏忽大意的结果。那么,为什么在这种情况下没有警告呢?也许发现这样的情况太复杂了?
编译器不会发出警告,因为您很可能正在更新构造函数内的某个static-member / global
变量(这是有效且有意义的(。例如:
struct A
{
static int count;
A () { count ++; }
};
现在,当你简单地调用一个临时的:
A();
如果没有发生这样的更新,编译器将不会深入A
的构造函数并检查是否发生了有用的事情。它总是假设是一个有效的场景。有许多这样的案例可以指出与临时性有关。
请注意,您提出的警告也将针对每个it++;
发出,这在许多for循环中都可以找到。
iamilind已经提到,有时它是有意创建并立即销毁临时的:当有副作用时。
在模板元编程中,可能会创建并销毁一个临时类,以防用户提供一个有副作用的类。当使用一个没有副作用的简单类来实例化模板时,模板代码中会出现警告。
因此,您提出的警告将有许多误报。在虚假的警告中很难找到真正的警告。
因此,我预计编译器供应商已经决定,他们的时间最好花在其他地方。
hmm。。我不确定,但这不能用普通的c++来保护吗?
class Mutex;
class Lock {
Lock(Mutex *mutex);
};
int main() {
Lock /* lock */ (&mtx);
return 0;
}
当使用DJGPP:进行编译时,我收到了此编译器警告
C:df>gxx -c a.cpp
a.cpp: In function 'int main()':
a.cpp:8:30: error: 'mtx' declared as reference but not initialized
如果我取消对"lock"的注释并添加一个互斥变量,它会编译得很好。
因此,如果你的"mtx"变量是一个指针。如果您更改它并将其作为"&mtx"传递,会发生什么。
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- 一位朋友将模板函数缩写为clang和gcc