HomeProductsDownloadOrderSupportSearch
  
 
 Myriad Blog 1.3.0 Saturday, Mar 22nd, 2025 at 00:48am 

Friday, Nov 22nd, 2024 at 05:45pm
Copier sur soi-même
Le langage C, que nous utilisons pour tous nos produits depuis la fin des années 80 est né il y a 50 ans.  
 
En C, certaines opérations un peu étranges sont marquées sur la documentation comme ayant un résultat non garanti. Mais là-dedans il y a des choses évidentes, qui en théorie seraient susceptibles d'après la doc de ne pas réagir comme attendu, mais fonctionnent correctement depuis le début.
 
C'est le cas, par exemple, lorsqu'on copie une chaîne de caractères ou une zone mémoire sur elle-même. Cette opération n'a pas d'effet, et c'est ce qu'on attend. Aucune raison que ça ne fonctionne pas.
 
Jusqu'à ce qu'un ingénieur de chez Apple se dise : ahah ! mais d'après la doc, cela pourrait ne PAS marcher, donc faisons en sorte que si quelqu'un le fait, ça crashe l'application. Il pouvait l'éviter par un simple petit test. Des programmeurs se sont plaints, mais non. Il était dans son droit, donc il l'a laissé comme ça.
 
Résultat : du code bien solide, resté inchangé depuis 20, 30 ans, qui se recompilait sans souci à chaque nouvelle version du système et qui fonctionnait, se met brusquement à planter.
On a donc passé la journée à sécuriser nos vieilles portions de code, pour éviter ce crash introduit volontairement. Des centaines de fichiers source (à la louche, plus de 600) à modifier et vérifier. C'est ce qu'on appelle du travail utile...
 
Bon week-end !
by Myriad
Comments

Comment from André Baeck Saturday, Nov 23rd, 2024 at 11:17am
(No subject)
"copie" une chaîne de caractères ou une zone mémoire sur elle-même. Cette opération n'a pas d'effet, et c'est ce qu'on attend. Aucune raison que ça ne fonctionne pas."
Dit comme ça, en effet. Mais a priori aucune raison qu'on le code ainsi.  
 
A moins qu'il ne s'agisse d'une copie d'une partie d'une zone sur  (une autre partie de) cette zone, avec un "chevauchement" plutôt qu'un recouvrement.  
Dans ce cas, le résultat peut dépendre du nombre d'octets transférés à la fois, de nos jours ce serait quatre ou huit.  
 
Naguère(!), en architecture 360 (mainframe IBM), une séquence qu'on écrirait a="-"..a en lua  avait comme effet de remplir de "-" toute la zone a, car le transfert se faisait d'un octet à la fois.  
 
Lorsqu'on est passé à des "mots" de plusieurs octets, une exception a été introduite pour que cette méthode continue à être valable.  
 
Mais évidemment, les préoccupations d'Apple ne sont pas les mêmes, au contraire.

Comment from Olivier Guillion Monday, Nov 25th, 2024 at 07:08pm
Et pourtant
Autant il est clair que la recopie d'une zone mémoire avec chevauchement peut donner des résultats inattendus tels que vous les décrivez (et pas naguère, c'est toujours le cas aujourd'hui), autant il n'y a strictement aucune raison qu'une recopie d'une zone sur elle-même crashe l'application.
 
Et, si, ça peut arriver. Bien sûr, pas avec un appel en littéral du type strcpy(str,str) facilement repérable, mais au fin fond d'une fonction qui utilise par exemple des structures se partageant un pool de chaines de caractères, et donc deux structures différentes peuvent pointer sur la même chaîne.


Most recent first
Oldest first

Top of page
Legal information Cookies Last update:  (c) Myriad