警告 C26441
Guard 物件必須命名 (cp.44)
C++ Core Guidelines
CP.44 :記得命名您的 lock_guard
s 和 unique_lock
s
備註
標準程式庫提供鎖定,協助控制其存留期間資源的平行存取。 當您宣告沒有名稱的鎖定物件時,編譯器會建立暫時物件,該暫存物件會立即解構,而不是位於封入範圍結尾的暫存物件。 因此,無法將鎖定物件指派給變數是有效停用鎖定機制的錯誤(因為暫時性變數是暫時性的)。 此規則會攔截這類非預期行為的簡單案例。
此診斷只會分析標準鎖定類型 std::scoped_lock
、 std::unique_lock
和 std::lock_guard
。 警告 C26444 涵蓋其他未命名的 RAII 類型。
分析器只會分析對建構函式的簡單呼叫。 更複雜的初始化運算式可能會導致錯誤的警告形式不正確。 分析器會忽略當做引數傳遞至函式呼叫或從函式呼叫傳回的鎖定。 無法判斷這些鎖定是否故意嘗試保護該函式呼叫,或是否應延長其 存留 期。 若要為函式呼叫所傳回的類型提供類似的保護,請使用 [[nodiscard]]
標注它們。 您也可以使用 [[nodiscard]]
標注建構函式,以避免該類型的未命名物件:
struct X { [[nodiscard]] X(); };
void f() {
X{}; // warning C4834
}
分析器會忽略建立為暫時的鎖定,但指派給具名參考以延長其存留期。
程式碼分析名稱: NO_UNNAMED_GUARDS
範例
在此範例中,遺漏範圍鎖定的名稱。
void print_diagnostic(std::string_view text)
{
auto stream = get_diagnostic_stream();
if (stream)
{
std::lock_guard<std::mutex>{ diagnostic_mutex_ }; // C26441
write_line(stream, text);
}
}
若要修正錯誤,請為鎖定指定名稱,以延長其存留期。
void print_diagnostic(std::string_view text)
{
auto stream = get_diagnostic_stream();
if (stream)
{
std::lock_guard<std::mutex> lock{ diagnostic_mutex_ };
write_line(stream, text);
}
}
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應