gpt4 book ai didi

c++ - 检测意外的弱链接符号

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

在我们公司,直到最近,我们还没有使用命名空间,因为一些编译器不能很好地支持它们。

这会导致多次出现以下错误:

file_A.cpp

class Node {
Data *ptr;
Node() { ptr = new Data; }
~Node() { delete ptr; }
};

file_B.cpp

class Node {
vector<int> v;
Point *pt;
Node(int x,int y) { pt = new Point(x,y); v.push_back(0); }
~Node() { delete pt; }
};

void foo() {
Node n(10,10);
...
} // calls file_B::~Node() !!!

每个作者 Node 都不知道另一个 Node 的存在,但是由于他预计这个类名可能会被重用,所以他没有创建 .hpp 文件用它。

编译器静静地删除其中一个析构函数,因为它们的签名匹配,并且很难找到错误,因为它可能不会在不同的计算机上复制。

一旦发现错误,人们就会逐渐意识到这一点,他们会尝试将定义密封在未命名的命名空间中,或者避免内联类主体中的成员函数[见下文] .

  • 问题 1:既然您不能相信程序员会始终记得进行防御性编程,是否有一种工具可以检测这些“意外的弱链接符号”?

    意外 我的意思是,Node.hpp 文件中定义,并且至少有一个类成员在类定义之间不匹配...

  • 问题 2:如果我们不使用命名空间,但我们内联每个函数,是否有可能自动生成的函数(复制-ctor, copy-assignment, destructor) 会产生前面提到的“弱链接错误”?


方式 1:包含在未命名 命名空间中

namespace {
class Node {
Data *ptr;
Node() { ptr = new Data; }
~Node() { delete ptr; }
};
}

方式二:避免内联

class Node {
Data *ptr;
Node();
~Node();
};

Node::Node() { ptr = new Data; }
Node::~Node() { delete ptr; }

最佳答案

如果您的代码库足够大,值得付出努力,您可以自定义现有编译器来解决您的问题:

  1. LLVM/Clang compiler is customizable(它是C++的,我不是很了解)。
  2. GCC编译器(最新版本,如 4.6)是可扩展的,可以通过用 C 编码的插件,或者通过用 MELT 编码的扩展 . MELT 是一种(免费的,GPLv3 许可的)高级领域特定语言,用于扩展 GCC。

在这两种情况下,都需要几天或几周的时间,最困难的部分是理解编译器内部表示(GCC 的 Gimple 和 Tree)和组织(例如传递)。

我是 MELT 的主要作者,我很乐意为您提供 MELT 方面的帮助,欢迎随时与我联系。

关于c++ - 检测意外的弱链接符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8318146/

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