是否有可能以任何方式(静态分析)防止或检测到以下错误,在这些错误中未捕获堆栈分配的对象,并且超出了与构造该对象相同的行的作用域?
Resource resourceA, resourceB;
void someFunction()
{
ScopedResourceBinder resourceBindA( resourceA );
ScopedResourceBinder( resourceB ); // <--- BUG
}
第一个
ScopedResourceBinder
是正确的,但是第二个ojit_code没有做任何事情,因为它在“绑定(bind)”之后立即(即从理论上讲)立即“取消绑定(bind)”。显然这是程序员的错误,但是我已经对此进行了几次调试(两次出现几个小时),这很难发现。一旦看到它,您就会认为“那是一个愚蠢的人”,但是在实践中,很容易犯错误,并且编译器是无防御的……是吗?
背景信息:我使用一个库,该库大量使用RAII类来推送弹出状态,例如OpenGL资源。通过作用域管理绑定(bind)是手动调用bind()/unbind()函数的一项重大改进,但此处列出的潜在错误是这种新模式带来的。
最佳答案
ScopedResourceBinder( resourceB );
与ScopedResourceBinder resourceB;
相同,即它声明了一个名称为resourceB
的命名变量,并调用了ScopedResourceBinder
的默认构造函数。
这种情况一直持续到函数结束,但是仍然是一个bug,因为它没有执行您绑定(bind)到变量resourceB
的意图。
为了防止这种特殊情况,您可以确保ScopedResourceBinder
没有默认的构造函数。
关于c++ - 可以检测未捕获的堆栈分配对象吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24622050/