1 votes

Pourquoi ai-je++; i--; juste après l'autre ?

Je regardais le code source de nmap qui a été publié en 1997 et j'ai remarqué cette section de code qui me semble un peu étrange :

int i=0, j=0,start,end;
char *expr = strdup(origexpr);
ports = safe_malloc(65536 * sizeof(short));
i++;                                         /* <<<<<< */
i--;                                         /* <<<<<< */
for(;j < exlen; j++) 
  if (expr[j] != ' ') expr[i++] = expr[j]; 
expr[i] = '\0';

Pourquoi auriez-vous i++; puis i--; juste après l'autre ? i est à 0, puis i++ transforme i en 1. Ensuite, i-- ramène i à 0.

Lien vers le code source original. Recherchez :

i++;
i--;

Est-ce que quelqu'un peut expliquer à quoi cela sert ?

155voto

dbush Points 8590

C'était un bug. Ces lignes ensemble font que i reste inchangé, elles n'auraient donc pas dû être là.

L'article lié qui a introduit nmap a été publié le 1er septembre 1997. Si vous regardez le dépôt SVN de nmap sur https://svn.nmap.org/nmap, la révision initiale enregistrée le 10 février 1998 n'a pas ces lignes :

int i=0, j=0,start,end;
char *expr = strdup(origexpr);
char *mem = expr;

ports = safe_malloc(65536 * sizeof(short));
for(;j < exlen; j++) 
  if (expr[j] != ' ') expr[i++] = expr[j]; 
expr[i] = '\0';

C'est donc quelque chose que l'auteur a trouvé et corrigé entre la publication du code source initial de nmap et la première vérification dans SVN.

42voto

S.S. Anne Points 13829

C'est inutile. Ça ne sert absolument à rien.

Si je devais spéculer, c'est probablement les restes de quelques codes de débogage qui ont été utilisés pendant le développement.

Je suppose qu'un des i++ ou i-- a été introduit dans un changement et l'autre a été introduit dans un autre.

Je n'ai aucun moyen de trouver le point d'introduction, cependant, car il n'y avait pas d'historique de révision entre la première version source et la première révision SVN.

9voto

Larry Fisher Points 99

Pour un compilateur non-optimisant, ou un compilateur reconnaissant les effets secondaires matériels, la séquence i++; i-- entraînerait la lecture de i depuis la mémoire, puis sa réécriture, quel que soit le chemin suivi à travers la boucle for et le if imbriqué.

En traitement parallèle, parfois des astuces de compilation sont utilisées pour garantir qu'une séquence de code utilise ses propres copies locales de variables plutôt que des copies globales.

Puisque l'exemple est un extrait de code, on ne peut pas déterminer le compilateur utilisé, le système d'exploitation/matériel attendu, ni si cela se trouve dans une séquence de code/fonction pouvant être exécutée en tant que thread indépendant.

Dans des systèmes plus simples, j'ai temporairement forcé des modifications aux variables pour tester la fonctionnalité de piégeage dans un environnement de débogage. Si c'était le cas, l'auteur aurait peut-être oublié de supprimer le code une fois le développement terminé.

2voto

TripleM Points 618

Je vous suggère de vérifier uniquement le code mis à jour. Si vous utilisez (i = 2+1) juste après cela (i-1) cela n'a aucun sens. La valeur de i reste inchangée. Vous pouvez essayer avec n'importe quel compilateur c ou c++. ou même dans n'importe quel autre langage c'est pareil. Exécutez le code dans le compilateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X