Avertissement C26441
Les objets Guard doivent être nommés (cp.44)
C++ Core Guidelines
CP.44 : N’oubliez pas de nommer vos lock_guard
s et unique_lock
s
Notes
La bibliothèque standard fournit des verrous pour aider à contrôler l’accès simultané aux ressources pendant leur durée de vie. Lorsque vous déclarez un objet de verrouillage sans nom, le compilateur crée un objet temporaire qui est immédiatement détruit plutôt qu’un objet qui réside à la fin de l’étendue englobante. Par conséquent, l’échec de l’affectation d’un objet de verrouillage à une variable est une erreur qui désactive efficacement le mécanisme de verrouillage (car les variables temporaires sont temporaires). Cette règle intercepte des cas simples de ce comportement inattendu.
Ce diagnostic analyse uniquement les types std::scoped_lock
de verrous standard, std::unique_lock
et std::lock_guard
. Avertissement C26444 couvre d’autres types RAII non nommés.
L’analyseur analyse uniquement les appels simples aux constructeurs. Des expressions d’initialiseur plus complexes peuvent entraîner des résultats incorrects sous la forme d’avertissements manqués. L’analyseur ignore les verrous passés en tant qu’arguments aux appels de fonction ou retournés à partir d’appels de fonction. Il n’est pas en mesure de déterminer si ces verrous tentent délibérément de protéger cet appel de fonction ou si leur durée de vie doit être prolongée. Pour fournir une protection similaire pour les types retournés par un appel de fonction, annotez-les avec [[nodiscard]]
. Vous pouvez également annoter les constructeurs pour [[nodiscard]]
éviter les objets sans nom de ce type :
struct X { [[nodiscard]] X(); };
void f() {
X{}; // warning C4834
}
L’analyseur ignore les verrous créés en tant que temporaires, mais affectés à des références nommées pour prolonger leur durée de vie.
Nom de l’analyse du code : NO_UNNAMED_GUARDS
Exemple
Dans cet exemple, le nom du verrou délimité est manquant.
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);
}
}
Pour corriger l’erreur, donnez un nom au verrou, ce qui étend sa durée de vie.
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);
}
}