检测对堆栈变量的调用delete(使用cast-to-pointer运算符)

时间:2015-09-11 07:01:33

标签: c++

tldr

有没有办法在以下代码中静态检测错误?

struct Foo
{
    operator const int*()
    {
        return &data;
    }

    int data;
};

int main() 
{
    Foo f;
    delete f;
}

由于存在从Foo到void *的转换,仅包含一个用户定义的转化,因此实际上允许在delete上调用f

更长的故事

在我们的代码库中,在伪代码中有一种非常愚蠢的反序列化字符串方式

char * buff = bar.loadString();
use buff;
delete buff;

方式已更改为一个模板化加载函数,因此现在反序列化看起来像

bar.load(m_IntMember);
bar.load(m_StringMember);

loadString的所有事件(很多都是)必须手动更改,如下所示:

string buff;
bar.load(buff);
use buff;

我们都知道人为错误会导致什么,所以有些地方代码被错误地修改,如

string buff;
bar.load(buff);
use buff;
delete buff;        //notice the delete

因为我们使用的是string的非标准实现,所以它实际上有一个overloaded const char * operator,可以将其转换为可以删除的void* ...

我想在编译时捕获所有这些错误(我们有自定义的高性能分配器,所以在运行时,很容易破坏内存而不会出现任何运行时错误)

我无法声明全局删除操作符接受const char* 我不能暂时删除string中的删除操作符,因为它被大量使用,所以没有它就无法编译(我不能"过滤掉"描述所有错误的错误,因为msvc在到达时停止编译一定数量的错误)

我该怎么办?

0 个答案:

没有答案