J'ai un void *
, appelez-le data
, dont je connais la longueur, mais qui n'est pas null terminé. Je fais un appel comme ceci snprintf(line, sizeof(line), "%*s", n, (const char*)data)
où n
est la longueur connue. Presque toujours cela fonctionne, mais parfois il en résulte une erreur de segmentation.Est-ce qu'un appel strlen dans snprintf provoque cette erreur de segmentation?
Chaque fois que segfault se produit, la trace arrière indique que le problème se trouve dans strlen. Et quand j'imprimer data
gdb, je vois quelque chose comme ça
(gdb) p n
$1 = 88
(gdb) p (const char*) data
$2 = 0x1d752fa8
"JASDF" ... "ADS"<Address 0x1d753000 out of bounds>
(gdb) p 0x1d753000-0x1d752fa8
$3 = 88
data
est en effet 88 caractères, mais est nulle fin pas, en fait, il semble qu'il se trouve tout contre un segment. Ma conjecture est que snprintf est toujours appelé strlen sur les données et j'ai l'habitude d'être chanceux car même si data
n'est pas terminé, il y a un \0
avant que j'atteigne le segment et parfois j'ai malchance et ça l'est. Est-ce correct? Si oui, quel est le travail?
C'est ce que la trace de la pile ressemble
#0 0x0000003c8927839e in strlen() from /lib64/libc.so.6
#1 0x0000003c89246749 in vfprintf() from /lib64/libc.so.6
#2 0x0000003c8926941a in vsnprintf() from /lib64/libc.so.6
#3 0x0000003c8924d0a3 in snprintf() from /lib64/libc.so.6
EDIT Pour répondre à ma propre question sur le travail autour, strncpy est une fonction plus approprié d'appeler. J'ai utilisé snprintf par habitude.
Comment 'line' est-il déclaré? –
'ligne char [256];' –