[PostgreSQL et C] Requête rebelle

Requête rebelle [PostgreSQL et C] - SQL/NoSQL - Programmation

Marsh Posté le 10-05-2007 à 16:43:32    

Bonjour,
 
Je n'arrive pas à exécuter 2 requêtes, la première passe sans problème. La seconde me met un Segmentation Fault.
Quand je rentre la requête manuellement, pas de soucis, lorsque je l'ajoute par "calcul", ça ne marche plus.
 
C'est-à-dire que :
 

Code :
  1. strcpy(maRequete,"" );
  2.        strcat(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = " );
  3.        sprintf(resultChar,"%f\0",result);
  4.        strcat(maRequete,resultChar);
  5.        printf("%s\n",maRequete);
  6.        res = PQexec(conn,maRequete);
  7.        printf("OK\n" );


 
Sur le terminal, j'ai comme résultat :  

Code :
  1. SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = 62500001887857.000000
  2. Erreur de segmentation


 
Tandis que si je change le code par :  

Code :
  1. strcpy(maRequete,"" );
  2.        strcat(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = 62500001887857.000000" );
  3.        strcat(maRequete,resultChar);
  4.        printf("%s\n",maRequete);
  5.        res = PQexec(conn,maRequete);
  6.        printf("OK\n" );


cela m'affiche :

Code :
  1. SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = 62500001887857.000000
  2. OK


 
 
 
 
Les chaînes de caractères sont pourtant identiques  :heink:

Reply

Marsh Posté le 10-05-2007 à 16:43:32   

Reply

Marsh Posté le 10-05-2007 à 16:54:11    

A mon avis, il y a des chances pour que l'erreur vienne de ta chaine de caractères maRequete ou res.

 

Tu lui as donné quelle taille ?
Tu as essayé de débugger ton programme ?


Message édité par AlphaZone le 10-05-2007 à 16:55:07
Reply

Marsh Posté le 10-05-2007 à 17:02:49    

J'ai mis char maRequete[250], ce que je ne saisis pas c'est que PQexec(conn,maRequete) fonctionne dans un cas mais pas dans un autre qui semble identique (conn ne change pas, maRequete semble identique).

Reply

Marsh Posté le 10-05-2007 à 17:17:04    

Comportement aléatoire => l'erreur se situe ailleurs. Donne-nous la fonction complète.

 

Néanmoins, plusieurs remarques :

  • je ne vois pas l'intérêt d'initialiser ta chaîne avec strcpy(), surtout avec un strcat juste après. Utilise par exemple strcpy() directement plutôt que strcat() sur la première chaîne ;
  • sprintf() ajoute tout seul un \0, inutile de lui en donner un ;
  • utilise plutôt strncpy(), strncat() et snprintf() pour ajouter des contrôles de taille. Pour les deux premières fonctions, lis attentivement les manpages car il y a des petites subtilités.


Message édité par Elmoricq le 10-05-2007 à 17:18:22
Reply

Marsh Posté le 10-05-2007 à 17:20:00    

Est-ce que ce ne serait pas un problème de transtypage ?  
 
Je veux dire ton result est manifestement calculé en variables numériques, et tu le mets ici comme string et le problème se situe là ...

Reply

Marsh Posté le 10-05-2007 à 17:21:46    

ZeBix a écrit :

Est-ce que ce ne serait pas un problème de transtypage ?  
 
Je veux dire ton result est manifestement calculé en variables numériques, et tu le mets ici comme string et le problème se situe là ...


Euh, non, parce que sprintf(). [:el g]

Reply

Marsh Posté le 11-05-2007 à 13:29:38    

Je m'en suis sorti avec sprintf(resultChar,"%.0f",result);

Reply

Marsh Posté le 11-05-2007 à 13:37:57    

Non, tu as seulement une configuration qui ne déclenche pas de segfault sur ton problème de gestion mémoire. [:moule_bite]
 
Le C c'est pas magique, hein. C'est pas en touchant à des trucs au hasard que ça va fonctionner.
 
Je subodore que resultChar est une cause possible de ton problème.  
Montre ta fonction.

Reply

Marsh Posté le 11-05-2007 à 13:57:50    

utilise PQexecParams

 

ou prepare ExecPrepared


Message édité par Taz le 11-05-2007 à 13:59:05
Reply

Marsh Posté le 11-05-2007 à 14:46:18    

resultChar n'apparaît qu'en début de fonction :
 

Code :
  1. char resultChar[16]; strcpy(resultChar,"" );


 
et dans le bout de code que j'ai copié en début de topic :
 

Code :
  1. strcpy(maRequete,"" );
  2.       strcat(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = " );
  3.       sprintf(resultChar,"%f\0",result);
  4.       strcat(maRequete,resultChar);
  5.       printf("%s\n",maRequete);
  6.       res = PQexec(conn,maRequete);
  7.       printf("OK\n" );

Message cité 1 fois
Message édité par SangJun le 11-05-2007 à 14:47:23
Reply

Marsh Posté le 11-05-2007 à 14:46:18   

Reply

Marsh Posté le 11-05-2007 à 14:50:23    

SangJun a écrit :

resultChar n'apparaît qu'en début de fonction :

 
Code :
  1. char resultChar[16]; strcpy(resultChar,"" );



 

Ah, quand même !

 

Bon.
resultChar pèse 16, donc 15 caractères libres + 1 caractère terminateur.
"62500001887857.000000" mesure... 21 ! Il faut au minimum une chaîne de 22 caractères de long pour contenir ce nombre sous forme de chaînes de caractères.

 


Donc, tu as un dépassement de capacité, et tu dois empiéter sur une zone mémoire utilisée par autre chose. D'où les segmentation fault aléatoires, qui disparaissent quand tu n'utilises plus resultChar.


Message édité par Elmoricq le 11-05-2007 à 14:50:49
Reply

Marsh Posté le 11-05-2007 à 14:53:51    

Mais pourquoi je ne l'ai pas vu avant !!!!!
 
Désolé de vous avoir faire perdre votre temps sur quelque chose d'aussi basique.

Reply

Marsh Posté le 11-05-2007 à 14:54:17    

Mais pourquoi je ne l'ai pas vu avant !!!!!
 
Désolé de vous avoir faire perdre votre temps sur quelque chose d'aussi basique  :sweat:

Reply

Marsh Posté le 11-05-2007 à 14:58:48    

d'où l'intérêt d'utiliser des fonctions comme snprintf(), strncat(), strncpy() etc.

Reply

Marsh Posté le 11-05-2007 à 15:09:35    

Ah ! Je savais bien que c'était un problème de tableau, sauf que je n'avais pas très bien situé l'erreur [:-slash-]

Reply

Marsh Posté le 11-05-2007 à 15:09:44    

ouais enfin cette méthode de zouave pour faire des requêtes c'est de l'injection SQL

Reply

Marsh Posté le 11-05-2007 à 15:22:12    

Ouais, après c'est sûr qu'il vaut mieux composer avec les fonctions spécificiques de l'API postgresql...

Reply

Marsh Posté le 11-05-2007 à 15:56:15    

et les palce holders peuvent sauver, pour les plus grosses requetes ^^


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed