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

C Discussion :

[Elaboration de Test] : ouverture de fichier


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut [Elaboration de Test] : ouverture de fichier
    Bonjour, je dois effectuer des tests sur un programme en C, j' ai un petit probleme sur la partie de code suivante. (Je tiens a preciser que ce n'est
    pas moi qui ai code le programme, mon travail se resume au test )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        ...
        if(access(argv[1],R_OK)==0) /*check file available for reading*/
            {
              in = fopen(argv[1], "r");  /* open file for reading */
              if(in==NULL) printf("can't open file %s\n", argv[1]);
            }
            else printf("no file %s, ", argv[1]);
        ...

    Donc, si mon parametre argv est un fichier qui n'existe pas, le programme m'affiche bien "no file blabla"
    Par contre, est ce que c'est possible d'avoir un cas de test dans lequel la fonction access me retourne 0
    mais la fonction fopen retourne null ?

    Ce que j'ai reussi a faire, c'est inserer un getchar() comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        ...
        if(access(argv[1],R_OK)==0) /*check file available for reading*/
            {
              getchar();
              in = fopen(argv[1], "r");  /* open file for reading */
        ...
    quand le programme attend sur le getchar(), j' efface mon fichier et donc j'ai mon cas de test. Mais en fait, je dois reussir a tester sans modifier le code.
    La solution proposee doit fonctionner sur Linux

    Merci à tous

    PS: Desole clavier a la noix QWERTY

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Lancer en background un programme qui créée le fichier et qui l'efface le plus vite possible (priorité élevée).

    Ce n'est pas très déterministe et cela ne fait pas très "test unitaire" mais avec un peu de persévérance et de chance (pour toi) et de malchance pour le développeur, tu devrais avoir des cas ou tu reproduis ce que tu essayes de mettre en évidence.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    En effet, je pourrai essayer... mais est ce que l'on peut dire catégoriquement si access dit OK alors fopen doit dire OK ?

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Non puisqu'il a des cas ou le fichier peut être effacé entre le access() et le fopen().

    Les 2 instructions ne sont pas atomiques ou alors, il faudrait poser un lock sur le file system (je ne sais pas si c'est possible) pour être sûr que le file system n'est pas modifié entre ces instructions. Mais bonjour le problème si tu tues le process pendant que le lock est posé et que cela ne libère pas le lock, il te restera alors que le bouton reset.

    Je crois que cela s'appelle une "race condition" ce type de problème.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Pour ton test la seule façon systématique serait à mon avis d'exécuter le programme dans un débugger. Tu met un point d'arrêt sur le fopen, tu supprimes le fichier, puis tu reprends l'exécution. Le problème c'est que piloter le débugger depuis un script, c'est pas forcément facile.

  6. #6
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    Merci pour vos reponses, j'en deduis donc que dans le cadre d'une execution "normale", il y a seulement un faible risque que access soit ok mais fopen soit nok

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Faible risque, peut être mais risque quand même.

    Au fait, pourqui faire 2 tests ? Pourquoi ne pas supprimer l'appel à access() et utiliser seulement le fopen(). Ainsi, tu seras atomique.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    En fait le truc c'est que le access() ne sert strictement à rien dans ce cas, puisque tout ce que fait access() est refait dans le fopen(). Donc effectivement, si j'étais toi je ne chercherai pas à tester ça.

  9. #9
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    Le but de l'exercice est justement de faire des "tests" . Donc oui access ne sert à rien ... c'est limite de la redondance si on fait fopen derrière. Mais malheureusement je ne peux pas toucher au code. Donc je déclarerais que la ligne de code ne sera probablement jamais exécuté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(in==NULL) printf("can't open file %s\n", argv[1]);
    A la limite, c'est le but des tests, de trouver ce genre de ligne "inutile".

  10. #10
    Expert confirmé

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

    Cette ligne n'est pas inutile, puisque fopen peut échouer (en plus d'un éventuel effacement du fichier entre access et fopen, le fichier peut parfaitement être interdit d'accès car verrouillé par un autre prog, par exemple).

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par TheHitman Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        ...
        if(access(argv[1],R_OK)==0) /*check file available for reading*/
    Pas de access() en C standard.

  12. #12
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    hmm c'est déjà plus intéressant ... dans le cas d'un fichier verrouillé par un autre prog je crois qu' access dis direct NOK non ? et l'éventuel effacement du fichier entre access et fopen est ce que j'essaye de reproduire ... mais comment ? on tourne en rond

    EDIT : pas d'access en C standard ... je ne peux pas quand même demander au prof de changer le sujet non ? ,je suis persuadé que c'est fait exprés pour que l'on puisse pas tester cette branche.

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par TheHitman Voir le message
    EDIT : pas d'access en C standard ... je ne peux pas quand même demander au prof de changer le sujet non ? ,je suis persuadé que c'est fait exprés pour que l'on puisse pas tester cette branche.
    Ca dépend. C'est un cours de C ou un cours de programmation système ?

  14. #14
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 14
    Par défaut
    Pire ... un cours de Génie Logiciel ... et d'ailleurs je suis content d'avoir
    fait du C parce qu'au moins je remarque qu'il y a des problèmes à certains endroits (le programme est beaucoup plus long ... et il y a quelques cas de dépassements tableaux qui passent à l'exécution sans trop de problème, du
    shiftage de bit farfelue, etc )

Discussions similaires

  1. [XL-2007] Test si fichier protégé en lecture (sans ouverture dudit fichier)
    Par chadom dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/07/2010, 11h08
  2. test ouverture fichier
    Par jazziestan dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/07/2008, 23h42
  3. Réponses: 21
    Dernier message: 09/02/2008, 23h09
  4. Test avant ouverture de fichier
    Par Yves2507 dans le forum Access
    Réponses: 6
    Dernier message: 10/09/2006, 09h57
  5. [VB] Test d'ouverture de fichier (permissions)
    Par mister3957 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/01/2006, 11h54

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