【发布时间】:2023-03-19 03:16:02
【问题描述】:
是否有可能以任何方式(静态分析)防止或检测以下错误,其中堆栈分配的对象未被捕获并超出构造它的同一行的范围?
Resource resourceA, resourceB;
void someFunction()
{
ScopedResourceBinder resourceBindA( resourceA );
ScopedResourceBinder( resourceB ); // <--- BUG
}
第一个ScopedResourceBinder 是正确的,但第二个没有做任何事情,因为它在“绑定”之后立即“解除绑定”(假设是这样)。
这显然是程序员的错误,但我现在已经调试了几次(几次都调试了几个小时),而且很难发现。一旦你看到它,你会认为“啊,那是一个愚蠢的”,但在实践中,很容易犯错误,编译器毫无防备......或者是吗?
背景信息:我使用的库大量使用 RAII 类来推送弹出状态,例如 OpenGL 资源。使用作用域管理绑定是手动调用 bind() / unbind() 函数的一大改进,但这里列出的潜在错误来自这种新模式。
【问题讨论】:
-
我的编译器为 ScopedResourceBinder(resourceB); 生成了一个错误;如果 ScopedResourceBinder 没有定义默认构造函数。 This matches ideone's C++ 4.8.1 behavior.
-
创建一个捕捉这个的clang插件。 clang.llvm.org/docs/ClangPlugins.html