簡體   English   中英

C++中noexcept“違規”的靜態分析

[英]Static analysis of noexcept "violations" in C++

我正在嘗試編寫異常安全代碼。 我發現使用 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分析可能證明......無用。 語言習語在設計時考慮了例外情況。


注意:作為一個題外話,可以重寫可選類,以便不暴露解除引用,因此是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.

clang-tidy 檢查 bugprone-exception-escape 試圖找到可能直接或間接拋出異常的函數,而當它們不應該時。 這包括檢查用throw()noexcept標記的函數。

https://clang.llvm.org/extra/clang-tidy/checks/bugprone-exception-escape.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM