The Effect of Code Obfuscation on Human Program Comprehension

Cette étude démontre que l'obfuscation de code augmente généralement le temps de compréhension et réduit la précision des prédictions d'exécution, bien que l'impact varie selon le langage (avec des effets non monotones en Python) et que l'expérience des développeurs soit davantage liée à la familiarité avec un langage spécifique qu'à une compétence générale.

Anh H. N. Nguyen, Jack Le, Ilse Lahnstein Coronado, Tien N. Nguyen

Publié Tue, 10 Ma
📖 6 min de lecture🧠 Analyse approfondie

Each language version is independently generated for its own context, not a direct translation.

Voici une explication simple et imagée de cette recherche scientifique, conçue pour être comprise par tout le monde, même sans être expert en informatique.

🕵️‍♂️ Le Grand Jeu du "Code Camouflé" : Comment le brouillage affecte notre cerveau

Imaginez que vous essayez de lire une recette de cuisine. Si les ingrédients sont bien nommés ("farine", "œufs") et les étapes claires ("mélanger", "cuire"), vous comprenez tout de suite. C'est comme lire du code informatique normal.

Mais que se passe-t-il si quelqu'un remplace "farine" par "X7", "œufs" par "Z9", et si, au lieu de dire "mélanger", la recette vous dit : "Si le nombre de pas est pair, allez à l'étape 5, sinon sautez à l'étape 12, puis revenez en arrière" ? C'est ce qu'on appelle l'obfuscation (le brouillage). Les pirates informatiques utilisent ces techniques pour cacher leurs secrets, mais les chercheurs se sont demandé : est-ce que cela rend vraiment le code impossible à comprendre pour un humain, ou est-ce que ça change juste la façon dont on réfléchit ?

Pour répondre à cette question, des chercheurs de l'Université du Texas ont organisé une expérience avec 50 étudiants. Ils leur ont donné des petits programmes (en Python et en JavaScript) et leur ont demandé de deviner le résultat final. Ils ont appliqué différents niveaux de "brouillage" :

  1. Niveau 0 (Code clair) : La recette normale.
  2. Niveau 1 (Noms bizarres) : Remplacer "compteur" par "var_abc".
  3. Niveau 1b (Noms piégeurs) : Remplacer "compteur" par "vitesse" (un nom qui a du sens, mais qui est faux pour ce contexte). C'est comme si la recette disait "Ajouter du sel" alors qu'il faut mettre du sucre.
  4. Niveau 2 (Chaos de l'ordre) : Mélanger les étapes de la recette pour qu'elles ne suivent plus l'ordre logique.
  5. Niveau 3 (Le cocktail explosif) : Tout mélanger à la fois.

Voici les découvertes principales, expliquées avec des analogies :

1. Le cerveau a deux modes de fonctionnement 🧠⚡

Les chercheurs utilisent une théorie célèbre : le Système 1 et le Système 2.

  • Le Système 1 (Le pilote automatique) : C'est rapide, intuitif. Vous reconnaissez une forme de code comme vous reconnaissez un visage. C'est ce qu'on utilise pour les tâches faciles.
  • Le Système 2 (Le détective) : C'est lent, lent, et demande beaucoup d'effort. C'est quand on trace chaque étape avec un crayon sur du papier.

La découverte : Quand le code est brouillé, le "pilote automatique" (Système 1) se trompe. Le cerveau est forcé de passer au mode "détective" (Système 2).

  • Résultat : Cela prend beaucoup plus de temps. Et paradoxalement, plus on réfléchit lentement, plus on a de chances d'avoir raison, mais seulement jusqu'à un certain point. Si on réfléchit trop longtemps, on finit par être perdu et faire des erreurs. C'est comme essayer de résoudre un casse-tête : un peu de réflexion aide, mais si on y passe 3 heures, on finit par être frustré et on pose le puzzle à l'envers.

2. Le Python et le JavaScript ne réagissent pas pareil 🐍 vs 🌐

C'est ici que ça devient fascinant. On pensait que plus le code est brouillé, plus c'est dur. Ce n'est pas toujours vrai !

  • Le JavaScript (Le langage flexible) : Pour ce langage, le brouillage fonctionne comme prévu. Plus on cache les choses, plus c'est dur. C'est comme si vous essayiez de lire un livre où les mots sont effacés : vous ne comprenez plus rien.
  • Le Python (Le langage structuré) : Là, c'est une surprise ! Parfois, brouiller le code rend la compréhension MEILLEURE.
    • Pourquoi ? Imaginez que vous lisez un roman où les personnages ont des noms trop familiers ("Jean", "Marie"). Votre cerveau fait des suppositions rapides ("Ah, Jean va sûrement faire ça"). Mais si on change les noms en "X" et "Y", votre cerveau arrête de deviner et se concentre vraiment sur l'histoire (la logique du code).
    • En Python, enlever les noms "évidents" force le lecteur à être plus attentif et à mieux analyser la structure, ce qui l'aide à éviter les pièges. C'est comme si le brouillage forçait le lecteur à arrêter de "survoler" le texte pour vraiment le lire.

3. L'expérience ne sauve pas tout (surtout pas entre les langues) 🎓

On pourrait penser qu'un expert en programmation comprend tout, peu importe le code.

  • Vrai : Si vous êtes expert en Python, vous êtes meilleur pour comprendre du code Python, même brouillé.
  • Faux : Cette expertise ne se transfère pas bien vers le JavaScript. Pire, parfois, être un expert en Python vous nuit quand vous lisez du JavaScript brouillé !
    • L'analogie : C'est comme un champion de tennis qui essaie de jouer au badminton. Ses réflexes de tennis (Système 1) sont si forts qu'ils l'empêchent de s'adapter aux règles du badminton. Il fait des erreurs parce qu'il essaie d'appliquer ses vieilles habitudes à un nouveau jeu.

4. Le temps n'est pas toujours une bonne mesure ⏱️

  • Réponse rapide : Souvent, c'est une erreur (le pilote automatique a triché).
  • Réponse moyenne (2 à 5 minutes) : C'est le "sweet spot" (le juste milieu). C'est là que le détective (Système 2) travaille bien.
  • Réponse très lente (10+ minutes) : C'est souvent le signe que la personne est complètement perdue et tourne en rond.

🎯 En résumé : Ce que cela nous apprend

  1. Brouiller le code ne rend pas toujours les choses plus difficiles de façon linéaire. Parfois, cela force les gens à être plus prudents et à mieux comprendre la logique, ce qui peut paradoxalement améliorer la précision (surtout en Python).
  2. Le cerveau humain est prévisible : Quand on enlève les raccourcis mentaux (les noms de variables), on force les gens à ralentir et à réfléchir plus profondément.
  3. Il n'y a pas de solution magique : Ce qui fonctionne pour cacher un code en JavaScript ne fonctionne pas forcément en Python. Les pirates doivent adapter leur stratégie selon la langue utilisée.
  4. L'expérience a ses limites : Connaître un langage par cœur peut même vous piéger dans un autre langage si vous ne faites pas attention.

La leçon finale : La sécurité par l'obscurité (cacher le code) est un jeu complexe. Ce n'est pas juste une question de "rendre le code illisible", mais de comprendre comment notre cerveau essaie de le comprendre. Parfois, enlever un peu de clarté nous force à être plus intelligents !