_itoa_s

_itoa_s - C - Programmation

Marsh Posté le 25-09-2006 à 09:32:22    

Bonjour,
 
Je dois travail sous MS-Windows et faire, entre autre, des conversions d'entiers vers des chaînes de caractères.
Pour ce faire, j'ai décidé d'utiliser la version sécurisée (et préconisée) de itoa : _itoa_s.
D'après la msdn :

Returned Value:
Zero if successful; an error code on failure....

(cf. http://msdn2.microsoft.com/en-us/library/0we9x30h.aspx)
Donc, avec cette fonction, je ne suis pas obligé de surdimensionner mon buffer cible et éventuellement, suivant le code de retour, je peux le redimensionner... Mais là mes doux rêves s'envolent car dès que je regarde d'un peut plus près _itoa_s qui finit par l'appel à

Code :
  1. static errno_t __stdcall xtox_s(
  2.    unsigned long val,
  3.    TCHAR *buf,
  4.    size_t sizeInTChars,
  5.    unsigned radix,
  6.    int is_neg
  7. )

définie dans xtoa.c (VC8\crt\src\), le seul return retourne 0 et il y a un test assez sympa :

Code :
  1. /* Check for buffer overrun */
  2. if (length >= sizeInTChars)
  3. {
  4.    buf[0] = '\0';
  5.    _VALIDATE_RETURN_ERRCODE(length < sizeInTChars, ERANGE);
  6. }


Du coup, je me demande si c'est moi qui ne comprend rien ou bien s'il y a une erreur dans l'implémentation...
Merci de vos lumières.

Reply

Marsh Posté le 25-09-2006 à 09:32:22   

Reply

Marsh Posté le 25-09-2006 à 09:54:16    

bb138 a écrit :


Je dois travail sous MS-Windows et faire, entre autre, des conversions d'entiers vers des chaînes de caractères.
Pour ce faire, j'ai décidé d'utiliser la version sécurisée (et préconisée) de itoa : _itoa_s.


 
Pas standard. Le plus simple est d'utiliser snprintf().
 
Exemple :

#include <stdio.h>
#include <stdlib.h>
 
/* juste pour l'exemple */
#define TAILLE_MAX 256
 
int main(void)
{
   int nombre = 123;
   char buffer[TAILLE_MAX];
 
   snprintf(buffer, TAILLE_MAX, "%d", nombre);
 
   printf("Nombre converti en chaine : %s\n", buffer);
 
   return EXIT_SUCCESS;
}


 
 
 

Reply

Marsh Posté le 25-09-2006 à 10:58:33    

Merci tu as absolument raison, snprintf fonctionne tout à fait comme il faut pour mon problème.
 
Saurais-tu par ailleurs si les fonctions dites "sécurisées" (exemple : _snprintf_s) sont juste des histoires Microsoft ou existent-elles aussi sous GNU/Linux par exemple ?

Reply

Marsh Posté le 25-09-2006 à 11:06:24    

Finalement après avoir lancé ma machine virtuelle, il ne semble pas y avoir de fonction "sécurisée", donc encore une histoire de Microsoft...

Reply

Marsh Posté le 25-09-2006 à 13:46:44    

bb138 a écrit :

Je dois travail sous MS-Windows et faire, entre autre, des conversions d'entiers vers des chaînes de caractères.
Pour ce faire, j'ai décidé d'utiliser la version sécurisée (et préconisée) de itoa : _itoa_s.


Mauvais choix. Le standard (C90) dispose de sprintf(). Un version plus sûr est disponible avec C99 : snprintf(). Ne pas se laisser endormir par les sirènes microsoftiennes...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-09-2006 à 11:04:39    

bb138 a écrit :

Pour ce faire, j'ai décidé d'utiliser la version sécurisée (et préconisée) de itoa : _itoa_s. D'après la msdn...


Fonctions "sécurisées" de la msdn ???  
J'ai plus confiance en "gets()" qu'en toutes les fonctions sécurisées de Micro$oft [:rofl]

Message cité 1 fois
Message édité par Sve@r le 26-09-2006 à 11:06:47

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-09-2006 à 18:23:16    

Sve@r a écrit :

Fonctions "sécurisées" de la msdn ???  
J'ai plus confiance en "gets()" qu'en toutes les fonctions sécurisées de Micro$oft [:rofl]


Arf, faut pas tomber non plus dans la caricature. Depuis que Microsoft fait des développements en interne avec une véritable politique de qualité, il y a de bonnes choses. Et puis ne pas confondre le département outils et langages avec le département bureautique. Rien à voir...
 
Ceci-dit, ce n'est pas Microsoft tout seul d'imposer sa vision sécurisée du C (warnings à la compilation), mais plutôt de faire évoluer la norme (la bibliothèque) ou de créer son langage (ce qu'il a été fait avec C#).


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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