gpt4 book ai didi

c++ - 检测对堆栈变量的调用删除(使用转换为指针的运算符)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:34 25 4
gpt4 key购买 nike

tldr

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

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

int data;
};

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

因为从 Foo 到 void* 的转换只包含一个用户定义的转换,所以实际上允许在 f 上调用 delete

长话短说

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

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 的非标准实现,它实际上有一个 重载的 const char * operator,可以转换为 void* 可以删除...

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

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

我能做什么?

最佳答案

这似乎可以做到:

#include <iostream>

struct Foo
{
Foo() : data(42) {}

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

int data;

struct AmbiguousPointerConversion {};
private: operator AmbiguousPointerConversion *() {
throw "hi";
}
};

int main()
{
Foo f;
const int *p = f;
std::cout << *p << '\n';
delete f;
}

用 g++ 编译它给我:

try.cc: In function ‘int main()’:
try.cc:25:12: error: ambiguous default type conversion from ‘Foo’
delete f;
^
try.cc:25:12: note: candidate conversions include ‘Foo::operator const int*()’ and ‘Foo::operator Foo::AmbiguousPointerConversion*()’
try.cc:25:12: error: type ‘struct Foo’ argument given to ‘delete’, expected pointer

关于c++ - 检测对堆栈变量的调用删除(使用转换为指针的运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32517466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com