gpt4 book ai didi

c++ - C++中noexcept "violations"的静态分析

转载 作者:IT老高 更新时间:2023-10-28 22:30:25 25 4
gpt4 key购买 nike

我正在尝试编写异常安全代码。我发现使用 C++11 的 noexcept 说明符使这个目标更容易实现。

当然,一般的想法是,当且仅当它调用的所有函数也都标记为“noexcept”时,一个函数才应该标记为“noexcept”。

问题在于,在大型代码库中,来自不同人的补丁经常合并在一起,很难确保保持这种一致性。

所以我希望能够运行静态分析,该分析可以列出标记为“nothrow”的函数调用未标记为“nothrow”的函数的所有位置。

据我在手册页中看到的,GCC 无法帮助我。有没有可以帮助我的独立工具?或者其他一些编译器?

最佳答案

如果您通过使用程序的 ABT 来避免指向函数的指针(并认为它们不安全),这当然是可能的。 Clang 的 AST 是(尽管它的名字)这样的 ABT:您将看到函数的声明和定义。通过一次完成一个定义的工作,您已经有了一个很好的基准。

另一方面,我想知道这是否实用。看,问题是任何执行内存分配的函数都(自愿地)被标记为可能抛出(因为 new 从不返回 null,而是抛出 bad_alloc)。因此,您的 noexcept在大多数情况下,将仅限于少数几个功能。

当然还有像@GManNickG这样的动态条件暴露,例如:

void foo(boost::optional<T> const t&) {
if (not t) { return; }

t->bar();
}

即使 T::barnoexcept , 取消引用 optional<T>可能会抛出(如果什么都没有)。当然,这忽略了我们已经排除了这个事实(这里)。

没有明确的条件函数何时可以throw , static分析可能证明……没用。语言习语的设计考虑到了异常(exception)情况。


注意:作为题外话,可选类可以重写,以免暴露解引用,因此是 noexcept (如果回调是):

template <typename T>
class maybe {
public:

template <typename OnNone, typename OnJust>
void act(OnNone&& n, OnJust&& j) noexcept(noexcept(n()) and
noexcept(j(std::declval<T&>())))
{
if (not _assigned) { n(); return; }
j(*reinterpret_cast<T*>(&_storage));
}

private:
std::aligned_storage<sizeof(T), alignof(T)>::type _storage;
bool _assigned;
};

// No idea if this way of expressing the noexcept dependency is actually correct.

关于c++ - C++中noexcept "violations"的静态分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652188/

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