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

Free Pascal Discussion :

Bug avec les variables fichiers Text


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut Bug avec les variables fichiers Text
    Bonsoir,

    Ca fait longtemps que je n'étais pas revenu dans cette zone du forum....

    Je viens de découvrir un bug de l'unité System aujourd'hui. Le bug s'exprime avec les variable de type Text, et qu'on a deux variables Text associé au même fichier.

    Si l'on fait par exemple

    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    VAR
       F1 : Text;
       F2 : Text;
     
    BEGIN
       Assign (F1, 'fichier.txt');
       Rewrite (F1);
       F2 := F1;
       Write (F2, '...');
       Rewrite (F1);
       Write (F2, '...');
       Close (F1);
    END.
    Le contenu de « fichier.txt » peut être tronqué (et il l'est même souvent). Il manque environ de 200 à 300 caractère dans « fichier.txt »

    Le code donné en exemple peut parraître d'une utilité douteuse, mais il arrive que dans des applications complexe, un fichier soit créé, puis que celui ci soit passer à une autre procédure, par l'intermédiaire d'une variable. Tout autant qu'il se peut qu'un fichier doivent être réinitialisé, pour en reprendre la constrution depuis le début (d'où le second rewrite). Et dans ces circonstances, ce bug s'exprime.

    Si avant de fermer le fichier on, fait
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Flush (F1);
       Close (F1);
    Le problème n'est pas résolu. Mais si on fait
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Flush (F2);
       Close (F1);
    Alors le problème est résolu.

    Ceci laisse penser que les variable de type Text ne peuvent pas être copier d manière sûre, et que leurs copie ne sont pas strictement des alias du même fichier. Elle se réfère plutôt chacune au même fichier, mais semble disposé de leur propre buffer.

    Ceci n'est pas sans poser de soucis, si deux processus différents écrivent dans un même fichier tour-à-tour, en employant des variables différentes.

    J'espère ne pas être trop confus dans la manière d'exposer ce bug.

    Bonne soirée

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Kao,

    Pour moi, ce n'est pas un bug, mais une mauvaise utilisation.

    C'est au programmeur de savoir ce qu'il fait.

  3. #3
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Citation Envoyé par droggo
    Kao,

    Pour moi, ce n'est pas un bug, mais une mauvaise utilisation.

    C'est au programmeur de savoir ce qu'il fait.
    Salut,

    Etaye tes propos please, dis-en plus.... je savais ce que je faisais justement : F1 et F2 sont associés au même fichier. Le premier rewrite cré le fichier, le deuxième rewrite réinitialise le fichier (vide son contenu), et ce, normalement pour les deux F1 et F2 (normal, elles sont associées au même fichier). Mais aprés ces opérations, tout se passe comme si F2 était détaché de « fichier.txt », ce qui est ouvertement anormal. Alors si ce n'est pas un bug ça, je ne sais pas ce que c'est

    C'est une mauvaise implémentation de l'unité System à mon avis, et j'ai une petite théorie sur son origine (théorie à vérifier).

    Les variables de type Text ou FILE, sont associées à une implémentation, disont un objet S, prennant en charge les appels système pour les accès aux fichiers.

    F1 est associé à S
    F2 est associé à S

    S contient par exemple un handle fichier, ou toute autre représentation faisant le lien avec le système.

    F1 et F2 peuvent correspondrent à deux positions différentes dans le fichier, et ont donc chacun leurs buffer de lecture/écriture associés à leur positions respectives dans le fichier. Mais apparement l'unité Système associe ces buffer directement au variable Text et FILE, alors que les buffers devraient êtres associés à l'objet S. Il s'en suit une erreur de synchronisation, et l'unité System s'emmèle les pinceaux avec deux buffers que de toute évidence elle n'arrive pas à synchroniser.

    C'est une hypothèse sur l'origine du problème, mais l'echec de synchronisation des buffers est certain lui.

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 043
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Il est à noter que l'assignation
    est illégale pour les compilateurs Turbo Pascal, Virtual Pascal et même Delphi.

    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  5. #5
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Alut,
    Citation Envoyé par Alcatîz
    Il est à noter que l'assignation
    est illégale pour les compilateurs Turbo Pascal, Virtual Pascal et même Delphi.

    Pour Turbo Pascal je ne me souviens plus ce qu'il en était (possible que c'était interdit, mais ça date, j'ai oublié), et je ne connais pas les deux autres. Mais FreePascal ne m'a renvoyé aucun message d'erreur. S'il autorise ces assignations, alors ils doit les prendre en charge normalement. Mais c'est vrai que ce serait une bonne alternative aussi que de tout simplement interdit F2 := F1, même si ça peut être pratique dans certains cas.

    Merci pour l'info sur ces trois autre compilateurs, j'en tiens compte pour me faire une raison

    @+

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 192
    Par défaut
    bonjour,



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    VAR
       F1 : Text;
       F2 : Text;
     
    BEGIN
       Assign (F1, 'fichier.txt');
       Rewrite (F1);
       F2 := F1;
       Write (F2, '...');
       Rewrite (F1);
       Write (F2, '...');
       Close (F1);
    END.

    j'ai regardé en diagonale ... mais il ne manque pas un close(F2) ? (ce qui pourrait expliquer que le buffer ne se vide pas ? )

    en tous cas c'est un peu dangereux comme méthode ...

    bonne continuation

Discussions similaires

  1. bug avec les fichiers CHM
    Par Lorenzo77 dans le forum Windows
    Réponses: 5
    Dernier message: 13/09/2008, 12h19
  2. [Sécurité] bug avec les variables de session!
    Par ozzmax dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2005, 19h41
  3. Problèmes avec les variables final
    Par casolaro dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2004, 14h29
  4. Réponses: 6
    Dernier message: 28/05/2004, 09h39
  5. [CR9] Bug avec les champs à valeur vide ?
    Par Djob dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/07/2003, 21h21

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