查找在给定指针类型上调用 free 的位置
Find where free is called on a given pointer type
我正在将类型从 C 样式结构转换为 C++ 样式结构;我正在添加一个成员,它将强制该类型需要一个构造函数,因此我必须从malloc
和free
切换到new
和delete
。我可以通过查找sizeof(TYPE)
找到分配类型的任何地方(由于此代码库的约定)。
有什么方法可以找到将该类型的指针传递给free
的所有实例?我意识到,由于对free
的论据是void*
这并不能保证我在任何地方都发现该类型被释放。
例如,我可以以某种方式重载free
,以便在调用free(TYPE*)
任何地方都会遇到编译错误,而不是在其他任何地方?
我可以以某种方式免费过载吗
你当然可以试一试。例如:
#include <cstdlib>
#include <iterator>
namespace my {
class TYPE { };
template <typename T>
void free(T *ptr) { std::iterator_traits<T>::attempt_to_free_TYPE; }
}
using std::malloc;
using std::free;
using my::TYPE;
int main() {
TYPE *ptr = (TYPE *) malloc(sizeof(TYPE));
free(ptr);
}
多亏了ADL,对free
的调用是my::free
,因此代码无法编译。显然这不会引起free((void*)ptr);
,因为使用my::TYPE*
以外的参数调用free
不受影响。
正如我所写的,不需要在命名空间my
或具有using namespace my;
的代码中调用任何调用free
。因此,您可能希望使用新发明的命名空间来实现此目的。或者写一个不那么包罗万象的模板,我即兴创作了那个。
它也不会捕获对std::free
的完全限定调用。重载std::free
(或命名空间 std 中的任何内容)是未定义的行为,但如果有必要,您可能只是为了查找调用站点而侥幸逃脱。像这样:
template <typename T>
struct allowed_to_free {
enum { value };
};
template <>
struct allowed_to_free<TYPE> {};
namespace std {
template <typename T>
void free(T *ptr) {
allowed_to_free<T>::value;
free((void*)ptr);
};
}
:如果您愿意在运行时进行签入,请考虑使用 valgrind 来执行此类任务。
Valgrind 会告诉您何时错误地free
了new()
分配的对象。
由于OP不在Linux中,而是在VS中,我想有类似于valgrind的工具。
另一种选择是使用静态分析器,例如覆盖率或 clang-analysis。
你不能直接做...但是,您可以提取一个技巧来查找使用此类(错误初始化)实例的所有位置。只需将以前的结构(现在是类)的所有成员设为私有即可。无论在哪里使用这些字段/成员,编译器都会引发错误。这将为您提供一个起点,以进一步分析代码并清除任何恶意/免费调用。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 调用 free() 有时会导致程序崩溃
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 malloc 之后检查 &在调用 free() 之前
- 在C++中调用 free() 会触发 ntdll!DbgBreakPoint() 在调试中,但在发布中崩溃
- free():多次调用后下一个大小(快速)无效
- 如果在 C++ 中的 malloc() 之后调用 free() 则会出现错误
- 由于多个线程中的 free() 调用,程序随机崩溃
- 调用free()时会发生混合语言程序崩溃
- 为什么我的代码在调用 free 时崩溃
- 标准C++的哪些部分将调用malloc/free而不是new/delete
- 在 sscanf() 之后调用 free() 时检测到堆损坏
- 为什么基类析构函数调用free
- QList析构函数行为-对列表中的指针调用delete/free()
- 在动态内存池中,对malloc的调用必须与对free的调用匹配
- 为什么 gcc 不编译这个调用 free() 函数的琐碎代码?
- 当代码流中既没有delete也没有free时,为什么在stdc++库中调用delete
- 查找在给定指针类型上调用 free 的位置
- 列出Xcode, iOS中最后的X malloc/free调用