2010-06-08 3 views
3

À certains endroits dans mon code, j'imprimer des messages de débogage comme ceci:Est-ce que `std :: string (strerror (errno))` est dangereux?

int ret = getLinkSpeed(device.getSysName(), linkSpeed); 
if (ret < 0) 
{ 
    logDebug("Failed to obtain port speed for this device. Error: " + std::string(strerror(errno))); 
} 

De l'documentation il est pas tout à fait clair si strerror retournera 0 sous certaines conditions (qui provoquerait mon code crash). Est-ce que quelqu'un sait si c'est sûr?

+0

Selon sa page de manuel linux: "Sur certains systèmes, strerror() renvoie NULL si le numéro d'erreur est inconnu." –

Répondre

11

Pourquoi ne pas écrire une fonction pour faire ceci:

string ErrStr() { 
    char * e = strerror(errno); 
    return e ? e : ""; 
} 

Ceci est facile à utiliser, autodocumenté, peut être adapté pour reformater la sortie et couvre la possibilité que strerror() peut retourner NULL (I je ne sais pas si ça peut).

+1

Je retournerais e? E: "erreur inconnue"; au moins les messages comportant une telle description d'erreur ne sembleraient pas incomplets. –

3

Bonne question (+1), la documentation semble assez floue. Je ne suis pas sûr s'il y a une source "plus dure", telle que la spécification POSIX par exemple.

En pensant un peu pragmatiquement, here est l'implémentation de GNU libc. Il renvoie un pointeur vers un tampon de chaîne statique, donc il ne peut pas renvoyer 0.

En réponse au commentaire de p00ya, la chose sûre (et aussi très pragmatique, heh) à faire face à des spécifications contradictoires, vagues ou incomplètes est bien sûr pour supposer le pire, et pas supposons que la valeur de retour sera toujours une chaîne valide.

+0

Selon POSIX, dans les cas où strerror a lui-même une erreur, la valeur de retour est indéfinie (bien que errno soit défini). Selon les spécifications seulement, je ne pense pas que vous puissiez compter sur un tampon accessible retourné (que ce soit 0 ou non). – p00ya

+0

'strerror()' est défini dans le standard C lui-même, où il n'est pas autorisé à échouer. – caf

3

Vous risquez de rencontrer des problèmes si vous utilisez une application multithread. Dans ce cas, vous devez utiliser strerror_r

Questions connexes