是否有可能以任何方式(静态分析)防止或检测到以下错误,在这些错误中未捕获堆栈分配的对象,并且超出了与构造该对象相同的行的作用域?

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/

10-11 19:02