Avertissement C26475
N’utilisez pas de casts C de style de fonction.
Instructions principales C++ : ES.49 : Si vous devez utiliser un cast, utilisez un cast nommé
Les casts de style de fonction (par exemple) int(1.1)
sont une autre forme de casts de style C (comme (int)1.1
), qui ont une sécurité douteuse. Plus précisément, le compilateur n’essaie pas de case activée si une perte de données peut se produire dans des casts C ou dans des casts de fonction. Dans les deux cas, il est préférable d’éviter le cast ou d’utiliser un initialiseur accoladé si possible. Si aucun des deux fonctionne, les casts statiques peuvent convenir, mais il est toujours préférable d’utiliser les utilitaires de la bibliothèque de prise en charge des instructions :
gsl::narrow
garantit la conversion sans perte et lève sigsl::narrowing_error
ce n’est pas possible.gsl::narrow_cast
indique clairement que la conversion peut perdre des données et qu’elle est acceptable.
Notes
Cette règle se déclenche uniquement pour les constantes des types primitifs. Le compilateur peut détecter clairement la perte de données dans ces cas et émettre une erreur si un initialiseur accoladé est utilisé. Les cas qui nécessitent une exécution au moment de l’exécution sont marqués par la NO_CSTYLE_CAST C26493.
Les initialiseurs par défaut ne sont pas marqués (par exemple
int()
).
Exemple
Exemple de conversion dangereux :
constexpr auto planck_constant = float( 6.62607004082e-34 ); // C26475
Erreur du compilateur pour la conversion dangereuse, détection de la perte de données potentielle :
constexpr auto planck_constant = float{ 6.62607004082e-34 }; // Error C2397
Pour corriger la conversion dangereuse, utilisez un type primitif de taille appropriée :
constexpr auto planck_constant = double{ 6.62607004082e-34 };