L'idée : copier une struct copie les pointeurs, pas ce qu'ils désignent
*c = *d est une copie superficielle : les deux champs char * sont copiés, donc le clone et l'original pointent vers les mêmes chaînes. Chacun croit les posséder. Chacun les libère. Le second free est un double free.
La règle qui l'évite : un pointeur libéré doit avoir un seul propriétaire.
La situation
doc_clone doit renvoyer un document totalement indépendant : modifier ou libérer l'un ne doit jamais affecter l'autre.
Votre mission
Lancez le sanitizer. Selon la ligne exécutée en premier, il signale un double free ou un use-after-free, et dans les deux cas il nomme l'endroit où le bloc a été alloué et celui où il a été libéré une première fois. Servez-vous-en pour dire au junior ce que doc_clone doit faire pour que chaque Doc possède des chaînes privées.
À surveiller
- « Ne libère pas deux fois » n'est pas une conception. Libérer moins fait fuir, et le partage reste là.
- Regardez comment
doc_newcrée ses chaînes. Le clone doit faire pareil.