# Le bêtisier du code source



## GrandGibus (24 Août 2006)

J'ouvre ici un sujet sur _les perles dans le code source_. Le but est de retranscrire de mani&#232;re concise un exemple de code source "stupide" de votre cru ou que vous avez pu lire. 

Le langage et la syntaxe ont peu d'importance, soyez le plus clair possible, afin que le maximum d'entre-nous comprenne.

Je commence:

```
for (int i=0; i<MAX; i++) {
        switch (i) {
            case 0: .... break;
            case 1: .... break;
            case 2: .... break;
            ...
        }
    }
```


P.S. c juste histoire de d&#233;tendre un peu l'atmosph&#232;re qui r&#232;gne en ce moment... peut-&#234;tre ce sujet aurait-il &#233;t&#233; plus appropri&#233; au Bar, mais c'est bien connu: l'humour d'informaticien... 


P.S. 2: c'est interdit de faire du copier/coller des extraits de code &#224; Tatouille :rateau:  :love:


----------



## tatouille (24 Août 2006)

c'est marrant je met un bout 


```
int i=0;
while (1)
{
   

   i++;
}
```

j'esp&#232;re que tu ne switch pas jusqu'&#224; MAX


----------



## GrandGibus (24 Août 2006)

J'ai ouvert ce post et j'ai imm&#233;diatement pens&#233; &#224; toi ... 

J'esp&#232;re au moins que ne sera pas seuls tous les deux  !


En r&#233;ponse: biens&#251;r que le switch va jusqu'&#224; Max !


----------



## tatouille (24 Août 2006)

après la boucle infini 
la boucle qui ne commence jamais


----------



## Lisaraël (24 Août 2006)

Si je retrouve les codes javascripts de certains amis que j'ai du corriger pour les aider, j'ai de quoi remplir dix pages de topic...

Mais ce sont des erreurs de d&#233;butant, c'est du coup beaucoup moins dr&#244;le...

Mais un bout de code qui m'a beaucoup fait rire lors d'une correction, c'est celui-ci (en javascript):


```
function verifConfirm(param) {
   if (param == true) {
      return true;
   } 
}
```

Et il l'utilisait tout le temps dans son code, avec des structures genre:


```
if( verifParam(maVariable) == true ) {
   [actions]
}
```

Le pire, c'est qu'il m'a fallu des heures pour lui faire comprendre son "erreur"...


----------



## PA5CAL (24 Août 2006)

Il m'est arriv&#233; de rester longtemps, incr&#233;dule, devant des bouts de code r&#233;calcitrants qui contenaient des erreurs de frappe (parfois du fait d'un copier-coller malheureux), du style :

```
for (i=0.0; i<1,5; i+=0.01)
{
   ...
}
```
_( "1,5" au lieu de "1.5" )_

ou encore :

```
while (condition);
{
   ...
}
```
_( ";" en trop )_


----------



## PA5CAL (24 Août 2006)

Un fois, un stagiaire m'avait pondu une fonction comme celle-ci :

```
void LibereListeChainee(ITEM *pItem)
{
   // variables locales
   ...

   if (pItem)
   {
      // lib&#233;ration de l'item suivant
      LibereListeChainee (pItem->pNext);

      // lib&#233;ration de l'item courant
      ... 
      free(pItem);
   }
}
```
La lib&#233;ration de la liste cha&#238;n&#233;e n&#233;cessitait autant de place sur la pile que l'espace occup&#233; par la liste elle-m&#234;me (plusieurs Mo). De ce fait, on atteignait rapidement l'overflow.

De plus, c'&#233;tait sous Windows, et les temps de lib&#233;ration devenaient exorbitants. Une liste allou&#233; en deux secondes sur la pile mettait pr&#232;s de cinq minutes &#224; se lib&#233;rer.

&#199;a marchait pourtant... sur le papier !


----------



## GrandGibus (24 Août 2006)

Tout un programme en Java (langage Objet par excellence), voici le genre de code type:


```
public UnObjet {
    public static Object[] les_champs;
}

public UneCollection {
    public static Object[][] une_liste_dobjets;
}
```

Heuresement, il y avait une classe "dictionnaire": 

```
public LeDico {
    public statc int UnObjetChamp1 = 0;
    public statc int UnObjetChamp2 = 1;
../..
}
```


On avait (re)baptisé le paradigme de ce logiciel: "Access everything from anywhere"


----------



## Didier Guillion (24 Août 2006)

Bonjour,

Sujet interessant. Il y a quelque temps j'ai port&#233; un soft Mac sur Windows (Reamlz). Le code &#233;tait truff&#233; d'acces du genre :

short a,b;

void fonction(void)
{
short *p;
short valSupposeeDeA,valSupposeeDeB;

p=&a;
valSupposeeDeA=*(p++);
valSupposeeDeA=*(p++);

}

Bien, sur, plantus assur&#233;, rien ne garantie la succession des donn&#233;es dans le BSS.

Cordialement


----------



## tatouille (24 Août 2006)

_ On avait (re)baptisé le paradigme de ce logiciel: "Access everything from anywhere" 

_pour pascal ca aurait pu etre rideau de suite

il m'est arrivé  de pas relacher dans un kmod  :rateau:
 et on en sortait jamais  donc ça ds un kernel space
 bouf load broumbroum  ca grossi ca grossi paf rideau


----------



## Didier Guillion (24 Août 2006)

tatouille a dit:
			
		

> _ On avait (re)baptisé le paradigme de ce logiciel: "Access everything from anywhere"
> 
> _pour pascal ca aurait pu etre rideau de suite
> 
> ...




Euh ? Tu peut décoder ?

Cordialement


----------



## p4bl0 (24 Août 2006)

Didier Guillion a dit:
			
		

> Euh ? Tu peut d&#233;coder ?
> 
> Cordialement


je vais essayer :
_On avait (re)baptis&#233; le paradigme de ce logiciel: "Access everything from anywhere" _
-> &#231;a &#231;a veux dire que &#231;a l'a fait rire


_il m'est arriv&#233;  de pas relacher dans un kmod :rateau: _
-> apparemment (je m'y connais pas assez, mais &#231;a commence par k) un truc en rapport avec le noyeau

_ et on en sortait jamais  donc &#231;a ds un kernel space_
-> Apparemment l&#224; il dit que c'&#233;tait de pire en pire

_ bouf load broumbroum ca grossi ca grossi paf rideau 
_
-> La le syst&#232;me &#224; lach&#233;...


P.S.: c'est encore une version b&#234;ta du traducteur


----------



## tatouille (24 Août 2006)

bah oui rideau bouffe toute la m&#233;moire

j'en ai une belle mais pas  de moi  
en ce moment sur le nouveau site opensource effort d'Apple

*Fatal error: out of dynamic memory in yy_create_buffer() in Unknown on line 0
*
http://www.macosforge.org/

je ne sais pas qui bidouille du sql foireux mais


----------



## p4bl0 (24 Août 2006)

"on line 0"

ah ouais c'est fort l&#224;...

J'vous le dis moi le libre c'est de la merde    :rateau:


----------



## Didier Guillion (24 Août 2006)

truk2oof a dit:
			
		

> je vais essayer :
> _On avait (re)baptisé le paradigme de ce logiciel: "Access everything from anywhere" _
> -> ça ça veux dire que ça l'a fait rire
> 
> ...




Désolé, pour moi c'est du broussouf. Dommage, c'était un fil interessant.

Cordialement


----------



## GrandGibus (24 Août 2006)

Dans la série VisualBasic, on pouvait trouver des appels du genre: 


```
goSub ta_mere_en_short
```


----------



## PA5CAL (24 Août 2006)

J'ai ai aussi eu une bonne, de la part du m&#234;me stagiaire dont je parlais au post #7.

Dans un outil de simulation, on remplissait une liste de r&#233;sultats de la mani&#232;re suivante:

```
void RemplissageListe(ITEM *debutListe)
{
   ITEM *pListe = debutListe;

   do {
      pListe->data = Calcul();  // remplit l'item avec les donn&#233;es calcul&#233;es
      pListe = pListe->suivant; // passe au suivant 
   } while ( pList!=NULL );

}

DATAITEM *Calcul()
{
   DATAITEM data;

   // calcule les donn&#233;es et les place dans data
   ...

   return &data; // retourne l'adresse de la structure locale !!!   
}
```
Comme vous le voyez, &data retourne toujours l'adresse de la structure DATAITEM pr&#233;sente sur la pile, et de surcro&#238;t lib&#233;r&#233;e &#224; la sortie de la fonction Calcul().

Au final, toute la liste de r&#233;sultats contenait (&#224; la relecture) des valeurs souvent identiques, car correspondant au dernier calcul effectu&#233;, parfois alt&#233;r&#233; par un remplissage inopin&#233; et important de la pile (&#224; l'occasion d'une interruption mat&#233;rielle, par exemple).

Le programme a tourn&#233; plusieurs semaines sans qu'on ne s'aper&#231;oive de rien, car les r&#233;sultats de la simulations &#233;taient assez plausibles. Seule une analyse plus fine lors des tests finaux a d&#233;montr&#233; le probl&#232;me. Et il m'a quand m&#234;me fallu un peu de temps pour retrouver cette &#226;nerie au beau milieu de plusieurs dizaines de milliers de lignes de code.

Il faut dire, on n'a pas id&#233;e...  hein ?


----------



## PA5CAL (24 Août 2006)

J'en ai vu passer une de chez Microsoft, que vous pouvez retrouver sur cette page Web.

Voici un morceau de code source de Microsoft Office Visual Basic :

```
//  Function:   RunCommandEx
//  Synopsis:   runs the given command in the current session, more robust
// than RunCommand
//  Arguments:  none
//  Returns:    S_OK if success
//  History:    October 3, 2000 - created [name withheld to protect the guilty]
HRESULT RunCommandEx(LPCWSTR szCmdLine) {
     DWORD dwTry = 0;
     HRESULT hResult = S_OK;

     // try run command 3 times at most
     while (dwTry<4) {
          hResult = RunCommand(szCmdLine);
          if (hResult!=E_FAIL) {
               // we succeeded
               break;
          }
          dwTry++;
     }
     if (dwTry==4) {
          ATLTRACE(L"COuld start the command even we tried 4 times\n");
          ASSERT(FALSE);
     }
     return hResult;
}
```
Ils r&#233;essayent trois fois, au cas o&#249; &#231;a ne marcherait pas du premier coup !  

Je vous recommande la lecture de la page web en question (et particuli&#232;rement du m&#233;mo interne destin&#233; &#224; Bill Gates). &#199;a vaut son pesant de cacahouettes !


----------

