OVH Cloud OVH Cloud

Bug C sous Solaris 5.x ?

4 réponses
Avatar
phan_tom_99
Bon voil=E0 j'ai a priori un bug dans le code C de bibclean, une
application pour nettoyer des entr=E9es BibTeX
(http://www.math.utah.edu/pub/bibclean/), je m'explique :

La fonction suivante compile sans probl=E8me tant sous ma debian (Linux
Gaia 2.6.8-1-386 #1 Thu Nov 25 04:24:08 UTC 2004 i686 GNU/Linux) que
sous le syst=E8me Solaris pour lequel je d=E9veloppe une application
utilisant bibclean (SunOS diabolo 5.8 Generic_108528-27 sun4u sparc
SUNW,Sun-Fire-880 et SunOS vignes.georgiatech-metz.fr 5.7
Generic_106541-10 sun4u sparc SUNW,Ultra-2).

Le probl=E8me (il en faut malheureusement) c'est que, apr=E8s debuggage,
il semble que la fonction unexpected() dans bibclean ne soit pas
appel=E9e.

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
fichier chek.c

void
check_month(VOID)
{
int m; /* month index */
size_t n =3D strlen(current_value);

if (n =3D=3D 3) /* check for match against standard
abbrevs */
{
for (m =3D 0; month_pair[m].old_name !=3D (const char*)NULL; ++m)
{
if (stricmp(month_pair[m].new_name,current_value) =3D=3D 0)
return;
}
}

/* Hand coding for the remaining patterns is too ugly to
contemplate,
so we only provide the checking when real pattern matching is
available. */

#if !defined(HAVE_OLDCODE)
if (check_patterns(pattern_names[PT_MONTH].table,current_value) =3D=3D
YES)
return;
#endif

unexpected();
}
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Apr=E8s modification du code, =E7a marche si unexpected() est plac=E9e
avant le bloc #if ... #endif :

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
fichier chek.c

void
check_month(VOID)
{
int m; /* month index */
size_t n =3D strlen(current_value);

if (n =3D=3D 3) /* check for match against standard
abbrevs */
{
for (m =3D 0; month_pair[m].old_name !=3D (const char*)NULL; ++m)
{
if (stricmp(month_pair[m].new_name,current_value) =3D=3D 0)
return;
}
}

unexpected();

/* Hand coding for the remaining patterns is too ugly to
contemplate,
so we only provide the checking when real pattern matching is
available. */

#if !defined(HAVE_OLDCODE)
if (check_patterns(pattern_names[PT_MONTH].table,current_value) =3D=3D
YES)
return;
#endif

}
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Donc s'agit-il d'un bug connu de Solaris 5.x ? Comment faire s'il y a
d'autres portions de code avec un probl=E8me semblable ailleurs ? Je
veux pas vraiment me farcir tout le code pour v=E9rifier si =E7a marche
ou pas sous Solaris...

Donc, la question serait : pourquoi =E7a marche pas dans le 1er cas ?

4 réponses

Avatar
DINH Viêt Hoà

#if !defined(HAVE_OLDCODE)
if (check_patterns(pattern_names[PT_MONTH].table,current_value) = > YES)
return;
#endif


D'après ce que tu décris, je suppose que tu passes dans cette branche de
code et que le return est appelé.

que fait check_patterns() ?

d'ailleurs, ce genre de code est une hérésie :

if (a(b) == YES)


vu que le résultat de a(b) est à priori déjà un booléen.

--
DINH V. Hoa,

"monde de merde" -- Erwan David

Avatar
Paul Gaborit
À (at) 4 Jun 2005 02:52:10 -0700,
"phan_tom_99" écrivait (wrote):
Donc s'agit-il d'un bug connu de Solaris 5.x ?


Certainement pas un bug de Solaris. Ni même du compilateur C que vous
utilisez.

Comment faire s'il y a d'autres portions de code avec un problème semblable
ailleurs ? Je veux pas vraiment me farcir tout le code pour vérifier si ça
marche ou pas sous Solaris...

Donc, la question serait : pourquoi ça marche pas dans le 1er cas ?


Parce que HAVE_OLDCODE doit être défini (par la configuration du produit) et
que le test doit l'être aussi et, par conséquent, le 'return' est effectué
avant l'appel à la fonction 'unexpected'...

Êtes-vous sûr de votre configuration ? Est-elle adaptée aux caractéristiques
de votre compilateur et de votre environnement ? Quel compilateur
utilisez-vous ? Quelle version ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>

Avatar
Antoine Leca
En <news:,
phan_tom_99 va escriure:
Le problème (il en faut malheureusement) c'est que, après debuggage,
il semble que la fonction unexpected() dans bibclean ne soit pas
appelée.


Et est-il prévu qu'elle le soit, avec un nom pareil ?
(plus question subsidiaire: pourquoi?)

check_month(VOID)
if (n == 3) /* check for match against standard abbrevs */
if (stricmp(month_pair[m].new_name,current_value) == 0)
return;


« Normalement », on sort ici, et le code appelant se débrouille avec un nom
de mois « normal ».

Pour la suite, on a donc un nom de mois « anormal » (par exemple, une
abréviation en français/en anglais, le genre de truc classique qui gêne ce
genre de code).
Voyons ce que l'on en fait...

#if !defined(HAVE_OLDCODE)
if (check_patterns(
return;
#endif


Si tu n'as *pas* "OLDCODE" (ce qui est je suppose ton cas), et que la
fonction check_patterns() réussit à interpréter d'une manière ou d'une autre
le nom « anormal », alors on repasse aussi le bébé au code appelant (et je
pense que ton problème c'est que le code appelant, lui, ne doit pas savoir
quoi faire avec cela, donc tu obtiens un comportement bogué).

unexpected();


Sinon tu sors par unexpected() qui doit générer un message de protestation
ou autre, et passer à la ligne suivante via je suppose un longjmp() (donc
pour toi « cela fonctionne »).

Après modification du code, ça marche si unexpected() est placée
avant le bloc #if ... #endif :


Évidemment, si tu court-circuites l'acceptation des noms « anormaux », le
code appelant n'a plus à traiter ce qu'il ne sait pas traiter, cela « marche
mieux » (et tu dois avoir encore plus de messages de protestation ignorés).


Donc s'agit-il d'un bug connu de Solaris 5.x ?


Heu ? pourquoi ?

Pose-toi plutôt les questions:

-- pourquoi n'as-tu pas OLDCODE, et qu'est ce que cela contrôle par ailleurs
?

-- qu'elle est la forme du mois qui fait passer par le deuxième return, et
essaye de tracer un peu pour voir pourquoi le code appelant cette fonction
ne peut pas s'en sortir.

Dans un cas ou dans l'autre, tu devrais arriver à la raison du bogue (non
décrit), et suffisament d'éléments pour te permettre de soumettre un raport
d'anomalie aux développeurs, et obtenir un correctif.


Je me base sur le commentaire
so we only provide the checking when real pattern matching is
available. */
qui donne à penser que le test est activé seulement quand un module « non
standard » ("real pattern matching") est disponible: typiquement, le
problème doit être dans le dit module, et son implémentation sur ta machine;
autrement dit, dans une portion de code très différente de celle que tu as
montrée.


Comment faire s'il y a
d'autres portions de code avec un problème semblable ailleurs ?


En passant: _quel_ est le problème ?


Antoine

Avatar
Paul Gaborit
À (at) Mon, 06 Jun 2005 08:21:55 +0200,
Paul Gaborit écrivait (wrote):
Parce que HAVE_OLDCODE doit être défini...


En fait, j'avais mal lu le code. C'est donc le contraire : HAVE_OLDCODE ne
doit pas être défini (ce qui est normal a mon sens). Le comportement du
programme doit donc être celui prévu.

Pourquoi croyez-vous donc qu'il y a un bug ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>