Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

boutisme et opérations sur les entiers

21 réponses
Avatar
Manuel Pégourié-Gonnard
Bonjour,

Bon, c'est un point que je crois avoir compris, mais j'aimerais juste
une confirmation (ou infirmation... et/ou précision) de votre part.

Considérons le programme suivant. Ai-je raison de croire que les
trois premiers paragraphes (jusqu'au commentaire « maintenant on dépend
du boutisme ») donnent un résultat indépendant du boutisme de la
plateforme ? Entre le deuxième et le troisième paragraphe, l'un vous
paraît-il plus lisible que l'autre ?

Merci,
Manuel.


#include <stdio.h>
#include <stdint.h>
#include <string.h>

int main(void)
{
const uint32_t a = 0xA4A3A2A1;
uint16_t b;

/* 1. On veut récupérer les 2 octets de poids fort de a dans b */
b = a >> 16;
printf("Poids fort\nb = 0x%X\n", b);

/* 2. Maintenant les deux octets de poids faible */
b = a & 0xFFFF;
printf("Poids faible\nb = 0x%X\n", b);

/* 3. Pareil, écrit autrement */
b = a;
printf("Poids faible 2\nb = 0x%X\n", b);

/*
* À partir de maintenant les résultats dépendent du boutisme
*/
memcpy(&b, &a, 2);
printf("Premiers octets\nb = 0x%X\n", b);

memcpy(&b, ((char *) &a) + 2, 2);
printf("Derniers octets\nb = 0x%X\n", b);

return 0;
}

--
Manuel Pégourié-Gonnard - http://people.math.jussieu.fr/~mpg/

1 réponse

1 2 3
Avatar
Marc
Marc Espie wrote:

In article <k9lo7q$lsq$,
Marc wrote:
clang a un -Weverything. gcc a toujours refusé de le créer, parce que
les utilisateurs risqueraient de mal l'utiliser et de faire perdre des
heures à tout le monde avec leurs râleries que tel warning ne leur plaît
pas (ils n'avaient qu'à ne pas l'activer !).



Etat d'esprit un peu arrogant, genre on sait mieux que l'utilisateur ce
dont il a envie. Rien de tres surprenant pour gcc donc.



En même temps, à ma connaissance, ils n'ont pas refusé un patch
implémentant -Weverything, ils ont juste refusé de l'écrire. Aussi,
certains développeurs de clang trouvent pénibles les utilisateurs qui
insistent pour râler dès qu'on ajoute un warning, qui se retrouve
automatiquement dans -Weverything, donc ce n'était pas de la parano
de la part de gcc. Donc ne pas oublier l'arrogance des utilisateurs,
pour faire pendant.

Apres, le fonctionnement des warnings dans gcc est un vrai gros bordel.
On ne peut qu'esperer que clang, etant parti de zero plus recemment, ne
fera pas les memes conneries.



Ils s'y sont effectivement pris très différemment. Mais note quand
même que les warnings de gcc ont progressé ces dernières années.

Un mini-patch (à peine testé et sans doute largement améliorable) pour
avoir -Weverything dans gcc-4.8 (aller dans le sous-répertoire gcc/
avant de l'appliquer) :

Index: common.opt
================================================================== --- common.opt (revision 194319)
+++ common.opt (working copy)
@@ -689,20 +689,24 @@ Common Var(warn_unused_variable) Warning
Warn when a variable is unused

Wcoverage-mismatch
Common Var(warn_coverage_mismatch) Init(1) Warning
Warn in case profiles in -fprofile-use do not match

Wvector-operation-performance
Common Var(warn_vector_operation_performance) Warning
Warn when a vector operation is compiled outside the SIMD

+Weverything
+Common Var(warn_everything) Warning
+Warn for no reason at all
+
Xassembler
Driver Separate

Xlinker
Driver Separate

Xpreprocessor
Driver Separate

Z
Index: optc-gen.awk
================================================================== --- optc-gen.awk (revision 194319)
+++ optc-gen.awk (working copy)
@@ -25,21 +25,22 @@
# This program uses functions from opt-functions.awk and code from
# opt-read.awk.
#
# Usage: awk -f opt-functions.awk -f opt-read.awk -f optc-gen.awk
# [-v header_name=header.h] < inputfile > options.c

# Dump that array of options into a C file.
END {

# Record first EnabledBy and LangEnabledBy uses.
-n_enabledby = 0;
+enabledby[0] = "Weverything";
+n_enabledby = 1;
for (i = 0; i < n_langs; i++) {
n_enabledby_lang[i] = 0;
}
for (i = 0; i < n_opts; i++) {
enabledby_arg = opt_args("EnabledBy", flags[i]);
if (enabledby_arg != "") {
n_enabledby_names = split(enabledby_arg, enabledby_names, " && ");
if (n_enabledby_names > 2) {
print "#error EnabledBy (Wfoo && Wbar && Wbaz) not currently supported"
}
@@ -72,20 +73,25 @@ for (i = 0; i < n_opts; i++) {
}

enabledby_arg = opt_args("LangEnabledBy", flags[i]);
if (enabledby_arg != "") {
enabledby_langs = nth_arg(0, enabledby_arg);
enabledby_name = nth_arg(1, enabledby_arg);
enabledby_posarg = nth_arg(2, enabledby_arg);
enabledby_negarg = nth_arg(3, enabledby_arg);
lang_enabled_by(enabledby_langs, enabledby_name, enabledby_posarg, enabledby_negarg);
}
+
+ if (flag_set_p("Warning", flags[i]) && flag_set_p("Var", flags[i])) {
+ enables["Weverything"] = enables["Weverything"] opts[i] ";";
+ enablesif["Weverything"] = enablesif["Weverything"] "" ";";
+ }
}


print "/* This file is auto-generated by optc-gen.awk. */"
print ""
n_headers = split(header_name, headers, " ")
for (i = 1; i <= n_headers; i++)
print "#include " quote headers[i] quote
print "#include " quote "opts.h" quote
print "#include " quote "intl.h" quote
1 2 3