强制c++编译器对一个对象的所有堆栈实例发出警告

Force c++ compiler to warn about all stack instances of an object

本文关键字:实例 堆栈 警告 编译器 c++ 一个对象 强制      更新时间:2023-10-16

为了优化的目的,我想重构一个大的代码库,在这里,我想防止类类型的堆栈使用。例如:

class noStack
{
    int x;
    // I don't want this on the stack
};
void foo()
{
    noStack bar; // I want the compiler to issue a warning here.
    class moreNoStack { int a; noStack b; }
    moreNoStack baz; // Also warn here because baz is on the stack and contains a noStack
}

但另一方面,我希望编译器忽略这个:

noStack g_globalNoStack; // no warning
class foo
{
    noStack bar; // no warning
};
foo g_globalFoo; // no warning
void func()
{
    foo* p = (foo*)malloc(sizeof(foo)); // no warning
    foo* q = new foo; // no warning
}

另一方面,如果没有办法让编译器这样做,那么我可以用另一种方式吗?意思是不警告堆栈使用,但总是警告全局实例或类的包含成员?

您可以将类构造函数设置为私有,然后创建一个类静态函数或自由友元工厂函数来为您构造实例。

工厂函数总是在堆上分配并返回一个指针(最好是智能指针)。

那么你会得到错误消息到处代码试图构造一个类实例,你可以去修复它们,而不是使用工厂函数。由于没有其他方法来构造对象,因此可以确保所有实例都在堆上分配。

您还可以为这些对象创建专门的内存池。如果它们非常大或奇怪,这可能有助于减少碎片。

除了在编译器中实现之外,没有办法强制编译器生成警告。我会使用clang-tidy,并将其与CI系统集成。下面是clang-tidy的简单教程:http://bbannier.github.io/blog/2015/05/02/Writing-a-basic-clang-static-analysis-check.html