Erreur de segmentation sur une requête programmée en C avec libxml2
Bonjour, je suis débutant en XML (j'ai commencé avant-hier :P), j'ai fait des recherches et j'ai trouvé quelques tutos et la bibliothèques libxml2.
Je code sur Linux un petit programme (plus précisement sur Raspbian mais passons).
J'ai donc un fichier actionToMidi.xml écrit à partir d'un petit programme fait par mes soins.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?xml version="1.0" encoding="UTF-8"?>
<root>
<action mouvement="jump">60</action>
<action mouvement="corps a corps">61</action>
<action mouvement="roulade">62</action>
<action mouvement="monter/descendre d'un vehicule">63</action>
<action mouvement="menu pause">64</action>
<action mouvement="map">65</action>
<action mouvement="PS menu">66</action>
<action mouvement="shoot">67</action>
<action mouvement="viser">68</action>
<action mouvement="reload">69</action>
<action mouvement="grenade">70</action>
<action mouvement="second">71</action>
<action mouvement="sprint">72</action>
<action mouvement="phone">73</action>
<action mouvement="vision nocturne">74</action>
<action mouvement="take a photo">75</action>
<action mouvement="swim">76</action>
<action mouvement="camera">77</action>
<action mouvement="move">78</action>
</root> |
Voici le code de mon programme (just un petit init, le main et la fonction qui fait la requête) que je compile avec la commande:
Code:
gcc rechercheNote.c -lxml2 -I/usr/include/libxml2 -o test
Code:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
xmlXPathContextPtr ctxt_actionToMidi = NULL;
xmlDocPtr doc_actionToMidi = NULL;
//Initialisation pour la lecture des fichiers XML
void init_XMLRead(){
// Création de l'arbre DOM à partir des fichiers XML
doc_actionToMidi = xmlParseFile("actionToMidi.xml");
if (doc_actionToMidi == NULL) {
fprintf(stderr, "Document XML invalide\n");
exit(EXIT_FAILURE);
}
// Récupération de la racine
xmlNodePtr racine = xmlDocGetRootElement(doc_actionToMidi);
if (racine == NULL) {
fprintf(stderr, "Document XML vierge\n");
xmlFreeDoc(doc_actionToMidi);
exit(EXIT_FAILURE);
}
xmlXPathInit();
ctxt_actionToMidi = xmlXPathNewContext(doc_actionToMidi);
if (ctxt_actionToMidi == NULL) {
fprintf(stderr, "Erreur lors de la création du contexte XPath\n");
exit(EXIT_FAILURE);
}
}
char* rechercheNote(char* bouton){
char *requete = malloc(200*sizeof(char));
strcpy(requete,"/root/action[@=\"");
strcat(requete,bouton);
strcat(requete,"\"]");
xmlXPathObjectPtr xpathRes_midi = xmlXPathEvalExpression(BAD_CAST requete, ctxt_actionToMidi);
if (xpathRes_midi == NULL) {
fprintf(stderr, "Erreur sur l'expression XPath\n");
exit(-1);
}
printf("Pre-Manipulation du résultat\n");
// Manipulation du résultat
if (xpathRes_midi->type == XPATH_NODESET) {
printf("Pre nodeTab[0]\n");
xmlNodePtr n = xpathRes_midi->nodesetval->nodeTab[0];
printf("Pre return xmlNodeGetContent(n)\n");
return xmlNodeGetContent(n);
}
return "";
}
int main ()
{
char* buffernote=NULL;
init_XMLRead();
printf("Avant recherche note\n");
buffernote=rechercheNote("map");
printf("Après recherche note\n");
printf("buffernot: %s\n",buffernote);
return 0;
} |
Ca fonctionne bien, si on recherche map, on reçoit bien 65 :P.
Par contre, ma question et mon problème sont:
Si je modifie le mot root par racine, cube ou je ne sais quoi dans le fichier .xml, mon programme plante et j'ai une erreur de segmentation.
Le programme plante dans la fonction char* rechercheNote(char* bouton) à la ligne:
Code:
xmlNodePtr n = xpathRes_midi->nodesetval->nodeTab[0];
Et j'ai pas trouvé le moyen de blinder, je ne sais pas comment protéger mon pauvre petit programme...
Donc j'en appel à votre connaissance, merci :P