Il y a une case dans clang-propre qui est appelé hicpp-signed-bitwise
. Cette case suit le libellé de la fissuration induite par l'hydrogène++ standard. Cette norme est disponible gratuitement et dit:
5.6.1. Ne pas utiliser les opérateurs au niveau du bit signé avec les opérandes
L'utilisation de signé opérandes avec les opérateurs sur les bits est dans certains cas soumis à l'indéfini ou de mise en œuvre de comportement défini. Par conséquent, les opérateurs au niveau du bit doit être utilisé uniquement avec des opérandes de type unsigned les types intégraux.
Les auteurs de la fissuration induite par l'hydrogène++ norme de codage mal interprété l'intention de le C et le C++ normes et que ce soit accidentellement ou intentionnellement porté sur le type des opérandes au lieu de la valeur de l'opérande.
Le check-in clang-propre implémente exactement ce libellé, afin de se conformer à cette norme. Cette vérification est pas destiné à être généralement utile, son seul but est d'aider les pauvres âmes dont les programmes ont à se conformer à cette règle stupide de la fissuration induite par l'hydrogène++ standard.
Le point crucial est que, par définition, les littéraux entiers sans suffixe sont de type int
, et que le type est défini comme étant un type signé. HIC++ maintenant, à tort, conclut que l'entier positif littéraux peut être négatif et pourrait donc invoquer un comportement indéfini.
Pour comparaison, la norme C11 dit:
6.5.7 opérateurs de décalage de bit-à-Bit
Si la valeur de l'opérande de droite est négatif ou est supérieure ou égale à la largeur de la promotion opérande de gauche, le comportement est indéfini.
Cette formulation est soigneusement choisi et souligne que la valeur de l'opérande de droite est important, pas son type. Il couvre également le cas d'une trop grande valeur, tandis que le HIC++ standard simplement oublié cette affaire. Donc, en disant: 1u << 1000u
est ok dans HIC++, tout en 1 << 3
ne l'est pas.
La meilleure stratégie est de désactiver explicitement cette seule case. Il y a plusieurs rapports de bogues pour CLion mentionner cela, et c'est en me fixe là.
Mise à jour 2019-12-16: j'ai demandé à Perforce ce que la motivation derrière cette formulation exacte, et si le libellé était intentionnel. Voici leur réponse:
De notre C++ de l'équipe qui ont participé à la création de la fissuration induite par l'hydrogène++ standard ont pris un coup d'œil à la Pile de Débordement de la question que vous avez mentionné.
En bref, en se référant au type de l'objet dans le HIC++ règle au lieu de la valeur est un choix volontaire pour faciliter automatisé de vérification du code. Le type d'un objet est toujours connu, tandis que la valeur n'est pas.
- HIC++ règles en général pour but d'être "decidable". Opposer le type assure une decidable case est toujours possible, c'est à dire. directement là où l'opérateur est utilisé ou si un type signé, est converti en unsigned.
- La justification se réfère explicitement à l' "possible" un comportement indéfini, donc une mise en pratique sensible peut exclure:
- constantes, sauf si il ya certainement un problème,et
- unsigned types qui sont promus à des types signés.
- La meilleure opération est donc de CLion à la limite de la vérification de la non-constante des types avant la promotion.