IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques, systèmes et outils C Discussion :

Réécriture sous 64 bits de fonction bas niveau utilisant une struct FILE


Sujet :

Bibliothèques, systèmes et outils C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut Réécriture sous 64 bits de fonction bas niveau utilisant une struct FILE
    Hello,

    Une fonction a été écrite en C sous 32 bits en utilisant non pas les fonctions standards genre fgets() mais les pointeurs bas niveau sur une structure de type _FILE.
    Or il semble que ce fonctionnement ne soit plus disponible sur un environnement 64 bits. Comment réécrire la fonction suivante svp ?

    Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    int machin(char *Buf, int Lg, FILE *Fic) {
          char *PtBuf;
          char Car;
          char *FinBuf;
     
          if (feof(Fic)) return(0);
          PtBuf = Buf;
          FinBuf = PtBuf + Lg - 1;
          do {
                if(Fic->_cnt == 0) {
                      _filbuf(Fic);
                      if(feof(Fic)) return(PtBuf - Buf);
                      if(Fic->_ptr != Fic->_base) {
                            Fic->_cnt += Fic->_ptr - Fic->_base;
                            Fic->_ptr = Fic->_base;
                      }
                }
                PtBuf[0] = Car = Fic->_ptr[0];
                Fic->_ptr ++;
                Fic->_cnt --;
                PtBuf ++;
          }
          while ((Car != '\n') && (PtBuf < FinBuf) && !feof(Fic));
          PtBuf[0] = 0;
          return(PtBuf - Buf);
    }

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Soit c'est du code interne de la bibliothèque standard, et dans ce cas, c'est déjà du travail de niveau gourou (implémenteur du langage)
    Soit c'est du code "normal", c'est à dire venant de n'importe où d'autre, et dans ce cas, la struct FILE n'a pas de définition officielle, donc, tu ne devrais pas t'en servir.

    Ma question est donc: pourquoi te retrouves-tu avec ce problème?

    Je note qu'il y a quelque chose de bizarre: l'usage de feof alors que le reste de la fonction n'utilise aucune fonction sur le fichier.
    feof se contente de regarder si le flag eof est défini dans le fic.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut
    Réponse: C'est dans une application écrite par je-ne-sais-qui en Pro*C et C pendant les années 90, et les serveurs expirent.
    Problème, on ne trouve plus que des serveurs 64 bits, et cinq programmes principaux de l'application à migrer invoquent des fonctions et des pointeurs de bas niveau qui ne fonctionnent plus en 64 bits.
    Voir : https://technet.microsoft.com/sr-lat...%28v=vs.100%29

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Des pointeurs « qui ne fonctionnent qu'en 32 bits », ça ne veut pas dire grand chose. Comment as-tu constaté le dysfonctionnement ? Que doit faire cette fonction ? Qu'est-ce qui empêche de la remplacer par un appel à fread ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut
    Le dysfonctionnement n'a pas été encore constaté, car le portage n'a pas encore eu lieu. Les renseignements préalables que je prends sur le net et ailleurs m'amènent à dire que l'on a de bonnes raisons de penser que l'écriture sous 64-bits de programmes utilisant la structure _FILE et les invocations de _ptr _base ou _cnt, ainsi que la manipulation de fichiers de plus de 2 Go vont amener des plantages et/ou des erreurs de compil.
    Me trompé-je ?
    Par ailleurs, je découvre ces programmes et n'ai pas l'information détaillée sur ce que font les fonctions en fait...

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu nous demandes comment réécrire une fonction dont tu ne connais pas le rôle.. ça risque d'être compliqué.

    FILE est une structure opaque de la bibliothèque standard. Comme l'a dit ternel tu n'es pas sensé la manipuler directement, à moins d'utiliser ta propre libc.

    Il faut nous en dire plus sur ce programme. Quel est le contexte ? S'exécute-t-il en espace utilisateur (y'a-t-il un système d'exploitation derrière) ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    De plus, ton code contient un appel à une fonction _filbuf(FILE*) qui n'est pas définie ici.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut
    On dirait que c'est en relation avec cet article : http://www.linuxjournal.com/article/2811
    Je poursuis mes investigations.
    On est dans une appli industrielle, mais pas système.

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    L'article dit "il y a le standard, mais comme ce n'est pas parfait, passent outre". Tu en paies le prix.

    Ne pas respecter le standard, c'est prendre un risque à chaque changement: au changement de système, c'est sûr, mais aussi à chaque mise à jour de n'importe quel composant non respecté. Et pire, de chaque composant logiciel se servant du composant violé.

    Imagine que tu change le fonctionnement "pour toi" d'un des membres de FILE*, il peut y avoir une bibliothèque, ailleurs, qui dépendant du fonctionnement initial.
    Paf, ca fait des bugs complètement intraçables.

    Quitte à migrer, reviens vers les fonctionnalités du standard, ou utilise une bibliothèque réputée qui fait le travail.

    En résumé: ne tolère jamais l'utilisation de comportemenst indéfinis.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Par défaut
    Oui, il semble que ce soit une réécriture de la fonction fgets() un peu gourou, on va revenir au standard.

    Sinon vous connaissez un lien vers un sujet qui traite de la question suivante svp : en ayant un exécutable, comment savoir les différents .o qui ont servi à la constitution de celui-ci après éditions de liens ?

    ldd est assez peu causant.

    Merci

  11. #11
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En général, on ne peut pas.
    En pratique, on devrait éventuellement pouvoir retrouver les frontières entre les .o dans le code.

  12. #12
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 551
    Par défaut
    Bonjour,

    Citation Envoyé par zan33 Voir le message
    Réponse: C'est dans une application écrite par je-ne-sais-qui en Pro*C et C pendant les années 90, et les serveurs expirent.
    Problème, on ne trouve plus que des serveurs 64 bits, et cinq programmes principaux de l'application à migrer invoquent des fonctions et des pointeurs de bas niveau qui ne fonctionnent plus en 64 bits.
    Voir : https://technet.microsoft.com/sr-lat...%28v=vs.100%29
    Qu’est ce qui vous empêche de re-compiler les sources à votre disposition sur une architecture 64 bits et de voir ce que cela donne (on supposant que vous avez tous les fichiers sources permettant la compilation) A moins que le ne code source ne contient que des routines système et autres instructions en assembleur pour une architecture donnée qui le rend non portable dans ce cas oui une adaptation du code s’avèrent nécessaire.

    D’un autre côté je ne vois pas trop ce que vous voulez dire par pointeur bas niveaux sachant qu’un pointeur est qu’une variable comme tant d’autres qui à la particularité de contenir que des adresses exemple l’adresse des "file descriptor" d’entrée sortie bas niveaux, mais cela ne veut pas dire que ce pointeur en question est un pointeur bas niveau, mais plutôt un pointeur qui contient l’adresse d’un élément bas niveaux (fd).

    Citation Envoyé par zan33 Voir le message
    On dirait que c'est en relation avec cet article : http://www.linuxjournal.com/article/2811
    Je poursuis mes investigations.
    On est dans une appli industrielle, mais pas système.
    Je ne comprends pas. Admettant, si on est dans une application industrielle et non système c'est-à-dire une application faite pour des microprocesseurs, microcontrôleur des systèmes temps réel ou système de contrôle de processus. Plus précisément des applications ou logiciel qui sont des interfaces entre l'informatique et des appareils industriels je ne vois pas comment il ne peut y avoir de la programmation système. Ou j'ai pas saisie le sens de la phrase....

    Citation Envoyé par zan33 Voir le message
    Oui, il semble que ce soit une réécriture de la fonction fgets() un peu gourou, on va revenir au standard.

    Sinon vous connaissez un lien vers un sujet qui traite de la question suivante svp : en ayant un exécutable, comment savoir les différents .o qui ont servi à la constitution de celui-ci après éditions de liens ?

    ldd est assez peu causant.

    Merci
    On ne peut pas connaître avec exactitude les instructions sources qui ont permis à l’élaboration du programme exécutable, mais vous avez tout de même la possibilité de récupéré le modèle de conception de l’exécutable en procédant à la rétro-ingénierie du programme exécutable à condition que cela soit justifié dans votre cas c’est probable, car l’exécutable en question n’est peut-être pas portable sur d'autre architecture (parce que la plateforme matérielle a changé ou évolué); mais cela implique également d'avoir des connaissances nécessaires pour comprendre et re-crée le modèle de conceptions (il existe tout de même des outils qui facilitent le travail "en partie"). Toutefois je tiens à préciser qu’en Europe la rétro-ingénierie est tolérée; mais interdit quand celui-ci est utilisé pour une reproduction commerciale voire une publication de diverses informations obtenu par la rétro-ingénierie. (En France il faut voir du côté de l'article L122-6-1 du code de la propriété intellectuelle).
    Tout de même, le plus simple serait de contacter l’éditeur du programme afin d’avoir les sources.

    à bientôt

Discussions similaires

  1. [XL-2003] fonction mscomm1.input utilisable une seule fois?
    Par Elfstat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2009, 13h02
  2. Réponses: 4
    Dernier message: 27/08/2007, 02h54
  3. Formatage bas niveau
    Par wareq dans le forum Composants
    Réponses: 5
    Dernier message: 09/05/2005, 16h00
  4. formatage de bas niveau ??
    Par vbcasimir dans le forum Windows XP
    Réponses: 11
    Dernier message: 06/05/2005, 18h45
  5. Programmation bas niveau de la carte vidéo !!
    Par Invité dans le forum Assembleur
    Réponses: 3
    Dernier message: 03/03/2005, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo