OVH Cloud OVH Cloud

gcc : priorité de recherche des methodes dans le système de fichier

21 réponses
Avatar
the.chojin
Bonjour,

j'ai une methode kill qui rentre en conflit avec celle de signal.h, et
j'aimerais savoir s'il y avait une option dans gcc (je n'en doute pas) pour
lui indiquer de chercher dabort les methodes dans ./ ?

Merci.

10 réponses

1 2 3
Avatar
Harpo
Emmanuel Delahaye wrote:


Et quelle est exactement l'intérêt de cette remarque ?


J'aime bien te chambrer, peux pas m'empêcher...

--
http://harpo.free.fr/

Avatar
the.chojin
Bonsoir,

merci de votre réponse, ca marche parfaitement.
C'est intéressant comme solution, merci beaucoup.


"Targeur fou" a écrit dans le message de news:

the.chojin wrote:
Bonjour,


Bonjour,


j'ai une methode kill qui rentre en conflit avec celle de signal.h, et
j'aimerais savoir s'il y avait une option dans gcc (je n'en doute pas)
pour

lui indiquer de chercher dabort les methodes dans ./ ?


kill() n'est pas une fonction de la bibliothèque standard C. Aussi, si
vous utilisez des options de gcc précisant une compilation conforme à
un standard C (C90 ou C99), vous ne devriez normalement pas à avoir ce
problème. J'e n'ai pas cygwin chez moi mais gcc d'Interix (Windows
Services for Unix) et j'ai constaté dans l'en-tête signal.h qu'il n'y
avait pas de contrôles de fait par rapport à la macro __STDC__ , i.e.
quasiment toutes les déclarations de fonctions, même non-standard
sont visibles même avec les flags gcc adéquats (flags utilisés :
-stdÈ9 -pedantic -Wall), et ça râle aussi si on déclare une
fonction kill.
C'est AMA une erreur qui peut être également présente avec Cygwin.

Une solution est de définir une macro kill pour écraser l'ancien nom
avec le nom d'une autre fonction, si toutefois on veut utiliser le nom
kill :

#include <stdio.h>
#include <signal.h>

/* decl fonction de déguisement */
/* ou plutôt usurpateur d'identité */
int myKill(int n);

/* On déguise kill(), il va au bal costumé aujourd'hui */
#define kill(a) myKill ( (a) )

/* implem. fonction de deguisement */
int myKill(int n);
{
puts("Je suis kill(), en fait myKill() de mon vrai nom");
puts("Je ne suis pas mechant, je ne ferais rien à n");
return n;
}

int main(void)
{
(void)kill(2);
return 0;
}

A+
Regis

Avatar
Harpo
Targeur fou wrote:

#include <signal.h>

/* decl fonction de déguisement */
/* ou plutôt usurpateur d'identité */
int myKill(int n);

/* On déguise kill(), il va au bal costumé aujourd'hui */
#define kill(a) myKill ( (a) )


Cela oblige à modifier le source, voire les sources si l'ainsi renommée
myKill n'est pas static.

--
http://harpo.free.fr/

Avatar
the.chojin
Pourquoi modifier plusieurs sources ?
Suffit de le renomer la declaration et l'implémentation et declarer le
#define a ce niveau (même visibilité).
Mais c'est vrai que ca a le désavantage de modifier les sources, je vais
essayé de trouver une solution plus propre ... (enfin j'ai mon logiciel qui
marche maintenant ^^)

Merci.

"Harpo" a écrit dans le message de news:
43cd6ade$0$20152$
Targeur fou wrote:

#include <signal.h>

/* decl fonction de déguisement */
/* ou plutôt usurpateur d'identité */
int myKill(int n);

/* On déguise kill(), il va au bal costumé aujourd'hui */
#define kill(a) myKill ( (a) )


Cela oblige à modifier le source, voire les sources si l'ainsi renommée
myKill n'est pas static.

--
http://harpo.free.fr/



Avatar
Harpo
the.chojin wrote:

Pourquoi modifier plusieurs sources ?


Si la fonction n'est pas déclarée comme static, elle peut être utilisée
par plusieurs sources (s'il y en a plusieurs dans l'appli), ce qui fait
que d'éventuels sources croyant appeler la fonction qui est maintenant
myKill pourraient appeler la fonction kill de la libc, surtout si elle
a la même signature.

Suffit de le renomer la declaration et l'implémentation et declarer le
#define a ce niveau (même visibilité).


Si on met le #define, je ne vois pas l'intérêt de modifier la
déclaration et l'implémentation si elles se trouvent après le #define.

Mais c'est vrai que ca a le désavantage de modifier les sources, je
vais essayé de trouver une solution plus propre ... (enfin j'ai mon
logiciel qui marche maintenant ^^)


Si ça marche, il n'y a a priori pas de problème, le hack est bon si la
fonction n'est pas utilisée dans un autre source, ce qui est
probablement le cas.
Je regarderais quand même ce que fait la fonction kill maintenant myKill
et je ferais un grep sur tous les sources de l'appli pour voir si elle
n'est pas référencée ailleurs.
Si il faut garder cette fonction, je la renommerais plutôt par myKill
dans tous le source, des fois qu'on aie ensuite envie d'appeler la
'vraie' fonction kill dans le programme.

--
http://harpo.free.fr/

Avatar
Antoine Leca
In news:43cc0798$0$25637$,
the.chojin va escriure:
j'ai une methode kill qui rentre en conflit avec celle de signal.h, et
j'aimerais savoir s'il y avait une option dans gcc (je n'en doute
pas) pour lui indiquer de chercher dabort les methodes dans ./ ?


gcc -ansi ?


Si cela trouve encore le kill() de <signal.h>, faire un rapport de bogue
chez le fournisseur de ce <signal.h>.


Antoine

Avatar
Antoine Leca
En news:43cc0cc6$0$11414$,
Emmanuel Delahaye va escriure:
Changer de nom. Utiliser un nom utilisé par l'implémentation invoque
un comportement indéfini.


Ne devrait pas, à moins que le nom ne soit réservé.
Il y a bien des règles sur les noms réservés ; mais ces règles ne concernent
kill(2) _que_ si tu programmes avec _POSIX_C_SOURCE_.


Antoine

Avatar
Vincent Lefevre
Dans l'article <dr27ho$i4q$,
Antoine Leca écrit:

gcc -ansi ?


Ça ne sélectionne que l'ancienne norme C. "gcc -stdÉ9" ou
directement "c99" pour la norme ISO C99.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

Avatar
Antoine Leca
En news:20060123105004$,
Vincent Lefevre va escriure:
Dans l'article <dr27ho$i4q$,
Antoine Leca écrit:

gcc -ansi ?


Ça ne sélectionne que l'ancienne norme C.


Oui. Et c'est bien mon conseil.


Antoine


Avatar
Vincent Lefevre
Dans l'article <43d654cf$0$15776$,
Antoine Leca écrit:

En news:20060123105004$,
Vincent Lefevre va escriure:
Dans l'article <dr27ho$i4q$,
Antoine Leca écrit:

gcc -ansi ?


Ça ne sélectionne que l'ancienne norme C.


Oui. Et c'est bien mon conseil.


Pourquoi ne pas sélectionner la norme C99?

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA



1 2 3