L'extrait de code Java le plus copié sur Stack Overflow contient un bogue
Et son auteur, Andreas Lundblad, développeur Java chez Palantir, propose un correctif
Le 2019-12-06 10:11:47, par Bill Fassinou, Chroniqueur Actualités
Une étude publiée en octobre 2018 dans la revue Empirical Software Engineering par les universitaires Sebastian Baltes et Stephan Diehl a révélé qu’un extrait de code fourni en réponse à une question Stack Overflow en septembre 2010 par Andreas Lundblad, développeur Java chez Palantir, est l’extrait de code Java le plus copié sur la plateforme communautaire. Cependant, dans un billet publié la semaine dernière, Lundblad a expliqué que le code était défectueux et qu'il convertissait de manière incorrecte le nombre d'octets dans des formats lisibles par l'homme.
L'extrait de code publié par Lundblad convertit le nombre d'octets, par exemple 123 456 789 octets, dans un format qui est lisible par l'homme, comme 123,5 Mo. Les universitaires ont constaté que ce code avait été copié et intégré dans plus de 6000 projets Java GitHub, plus que tout autre extrait de code Java sur Stack Overflow. Mais, Lundblad a dit qu'il avait revu le code après avoir pris connaissance de l'article universitaire et de ses résultats, ce qui lui a permis de se rendre compte de l'existence du bogue. Il a publié une version corrigée du code sur son blog.
Lundblad a expliqué que le code contenait un bogue de conversion trivial qui n'a abouti qu'à des estimations de taille de fichier légèrement inexactes. Cela dit, l’on estime que cela aurait été bien pire que cela. Le code aurait pu contenir une faille de sécurité, par exemple. Si c'était le cas, il aurait fallu des mois ou des années pour réparer toutes les applications vulnérables, ce qui aurait exposé les utilisateurs à des attaques. Des études ont démontré qu’il n’est pas recommandé de copier et coller du code à partir des sites spécialisés, mais les développeurs le font toujours.
Le rapport d’étude de 2018 a montré à quel point cette pratique était répandue dans l'écosystème Java. Il a aussi indiqué que la grande majorité des développeurs qui copiaient les réponses populaires de Stack Overflow n'ont même pas pris la peine de mentionner leur source. Cette pratique démontre le fait que de nombreux développeurs de logiciels qui copient du code sur Stack Overflow sans attribution cachent effectivement aux autres programmeurs qu'ils ont introduits un code qui n’a pas été validé par l’équipe de développement dans un projet.
Un autre rapport publié cette année, en octobre, estime également que copier du code sur des plateformes spécialisées et l'utiliser pour ses propres projets peut les rendre vulnérables. Le rapport a été publié par six chercheurs en informatique issus de l'Université de Shiraz en Iran, de l'Université polytechnique de Montréal au Québec et de l'Université Chamran en Iran. Le rapport des universitaires cherchait à comprendre la nature et la prévalence des vulnérabilités en matière de sécurité dans les exemples de code en C++ partagés.
« Dans les sessions de collaboration impliquant plusieurs codeurs humains, nous avons évalué manuellement les vulnérabilités de sécurité de chaque fragment de code conformément aux instructions de CWE (Common Weakness Enumeration). Parmi les 72 483 extraits de code examinés utilisés dans au moins un projet hébergé sur GitHub, nous avons trouvé un total de 69 extraits de code vulnérables classés dans 29 types. Beaucoup d'extraits de code étudiés ne sont toujours pas corrigés », ont déclaré les chercheurs dans leur rapport.
Les 69 extraits de code vulnérables trouvés sur Stack Overflow ont été réutilisés dans un total de 2859 projets GitHub. Pour améliorer la qualité des extraits de code partagés sur Stack Overflow, ils ont développé une extension de navigateur qui permet aux utilisateurs de Stack Overflow de rechercher les vulnérabilités dans les extraits de code lorsqu'ils les téléchargent sur la plateforme. Toutefois, malgré les mises en garde des chercheurs, les développeurs copient toujours du code de Stack Overflow vers leurs projets sans pour autant procéder à une analyse.
Ashkan Sami, professeur agrégé d'informatique, d'ingénierie et de technologie de l'information à l'Université de Chiraz en Iran, a déclaré que la recherche représentait une tentative pour examiner comment le code défectueux migre de Stack Overflow vers GitHub. « En gros, ce que nous avons essayé de montrer, c’est que le fait d’utiliser du code de Stack Overflow sans l’examiner attentivement peut conduire à des vulnérabilités au sein des applications », a déclaré Sami. L’étude fait également référence à un article académique datant de 2017.
Selon cet article, 1161 extraits de code non sécurisés publiés sur Stack Overflow avaient été copiés et collés dans 1,3 million d'applications Android disponibles sur Google Play.
Sources : Résultat de l’étude, Rapport de l’étude (PDF), Andreas Lundblad
Et vous ?
Qu'en pensez-vous ?
Copiez-vous aussi du code sur Stack Overflow pour vos projets de développement ?
Peut-on s'en passer ? Si non, comment éviter de rendre vulnérable son application ?
Voir aussi
Copier du code sur des plateformes spécialisées et l'utiliser pour ses propres projets peut les rendre vulnérables, d'après une étude
Microsoft évoque le futur de C++/CLI et de .NET Core : C++ sera disponible sur .NET Core 3.1 pour Windows
La première version finale de Nim, le langage doté d'un transcompilateur vers C, C++, JavaScript est disponible avec des ajouts
Code : |
1 2 3 4 5 6 7 | public static String humanReadableByteCount(long bytes, boolean si) { int unit = si ? 1000 : 1024; if (bytes < unit) return bytes + " B"; int exp = (int) (Math.log(bytes) / Math.log(unit)); String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); } |
code contenant le bogue
L'extrait de code publié par Lundblad convertit le nombre d'octets, par exemple 123 456 789 octets, dans un format qui est lisible par l'homme, comme 123,5 Mo. Les universitaires ont constaté que ce code avait été copié et intégré dans plus de 6000 projets Java GitHub, plus que tout autre extrait de code Java sur Stack Overflow. Mais, Lundblad a dit qu'il avait revu le code après avoir pris connaissance de l'article universitaire et de ses résultats, ce qui lui a permis de se rendre compte de l'existence du bogue. Il a publié une version corrigée du code sur son blog.
Lundblad a expliqué que le code contenait un bogue de conversion trivial qui n'a abouti qu'à des estimations de taille de fichier légèrement inexactes. Cela dit, l’on estime que cela aurait été bien pire que cela. Le code aurait pu contenir une faille de sécurité, par exemple. Si c'était le cas, il aurait fallu des mois ou des années pour réparer toutes les applications vulnérables, ce qui aurait exposé les utilisateurs à des attaques. Des études ont démontré qu’il n’est pas recommandé de copier et coller du code à partir des sites spécialisés, mais les développeurs le font toujours.
Code : |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // From: https://programming.guide/worlds-most-copied-so-snippet.html public static strictfp String humanReadableByteCount(long bytes, boolean si) { int unit = si ? 1000 : 1024; long absBytes = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes); if (absBytes < unit) return bytes + " B"; int exp = (int) (Math.log(absBytes) / Math.log(unit)); long th = (long) (Math.pow(unit, exp) * (unit - 0.05)); if (exp < 6 && absBytes >= th - ((th & 0xfff) == 0xd00 ? 52 : 0)) exp++; String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i"); if (exp > 4) { bytes /= unit; exp -= 1; } return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); } |
Correctif proposé par Andreas Lundblad
Le rapport d’étude de 2018 a montré à quel point cette pratique était répandue dans l'écosystème Java. Il a aussi indiqué que la grande majorité des développeurs qui copiaient les réponses populaires de Stack Overflow n'ont même pas pris la peine de mentionner leur source. Cette pratique démontre le fait que de nombreux développeurs de logiciels qui copient du code sur Stack Overflow sans attribution cachent effectivement aux autres programmeurs qu'ils ont introduits un code qui n’a pas été validé par l’équipe de développement dans un projet.
Un autre rapport publié cette année, en octobre, estime également que copier du code sur des plateformes spécialisées et l'utiliser pour ses propres projets peut les rendre vulnérables. Le rapport a été publié par six chercheurs en informatique issus de l'Université de Shiraz en Iran, de l'Université polytechnique de Montréal au Québec et de l'Université Chamran en Iran. Le rapport des universitaires cherchait à comprendre la nature et la prévalence des vulnérabilités en matière de sécurité dans les exemples de code en C++ partagés.
« Dans les sessions de collaboration impliquant plusieurs codeurs humains, nous avons évalué manuellement les vulnérabilités de sécurité de chaque fragment de code conformément aux instructions de CWE (Common Weakness Enumeration). Parmi les 72 483 extraits de code examinés utilisés dans au moins un projet hébergé sur GitHub, nous avons trouvé un total de 69 extraits de code vulnérables classés dans 29 types. Beaucoup d'extraits de code étudiés ne sont toujours pas corrigés », ont déclaré les chercheurs dans leur rapport.
Les 69 extraits de code vulnérables trouvés sur Stack Overflow ont été réutilisés dans un total de 2859 projets GitHub. Pour améliorer la qualité des extraits de code partagés sur Stack Overflow, ils ont développé une extension de navigateur qui permet aux utilisateurs de Stack Overflow de rechercher les vulnérabilités dans les extraits de code lorsqu'ils les téléchargent sur la plateforme. Toutefois, malgré les mises en garde des chercheurs, les développeurs copient toujours du code de Stack Overflow vers leurs projets sans pour autant procéder à une analyse.
Ashkan Sami, professeur agrégé d'informatique, d'ingénierie et de technologie de l'information à l'Université de Chiraz en Iran, a déclaré que la recherche représentait une tentative pour examiner comment le code défectueux migre de Stack Overflow vers GitHub. « En gros, ce que nous avons essayé de montrer, c’est que le fait d’utiliser du code de Stack Overflow sans l’examiner attentivement peut conduire à des vulnérabilités au sein des applications », a déclaré Sami. L’étude fait également référence à un article académique datant de 2017.
Selon cet article, 1161 extraits de code non sécurisés publiés sur Stack Overflow avaient été copiés et collés dans 1,3 million d'applications Android disponibles sur Google Play.
Sources : Résultat de l’étude, Rapport de l’étude (PDF), Andreas Lundblad
Et vous ?
Voir aussi
-
OButterlinModérateurCe ne serait pas plutôt : Créer une prise de conscience sur le fait que copier bêtement du code pris sur le net n'est pas sans danger ?
Si oui, je suis assez d'accord... comme dirais les Inconnus, il y a le bon programmeur et le mauvais programmeur...le 06/12/2019 à 18:29 -
TahrkyMembre régulierJ'avoue ne pas bien comprendre cette phrase ...
Si une revue de code est fait par les autres développeurs dans un projet, en quoi cité l'auteur change-t-il quelque chose ?
Je suis d'accord, c'est plus éthique de le faire, mais quand bien même.
Je veux dire, si c'est X qui publie son code, c'est un génie alors on ne vérifie pas ?
Ou alors X est un gros nul, on vérifie tjr son code, mais si ça vient d'internet, alors on fait confiance ?
Parce que certe, du code sur internet n'a pas être pas été validé par une équipe de dev dans un projet, mais ce qu'on écrit non plus.
Cela peut-être validé après (publication via git par exemple), et à ce moment là, tout est censé être vérifié, indépendamment de la source, non ?le 06/12/2019 à 10:54 -
VoyvodeMembre émériteOui, c'est moche à voire.
En remplaçant par espace, c'est tout de suite plus lisible.
Cette expérience montre aussi qu'un code compact et apparemment astucieux n'est pas forcément meilleur. La version corrigée est tout de suite moins intéressante que la nouvelle solution proposée sur Stack Overflow qui me parait plus claire.le 06/12/2019 à 23:40 -
yahikoRédacteur/ModérateurJe dirais qu'un mauvais développeur, appelons-le Kévin (no offence pour les Kévin), fait clairement mieux de copier/coller du code depuis Stackoverflow que de coder lui-même.
Il y a quand même moins de chance qu'il y ait des bugs sur du code approuvé 467 fois que du code réalisé par Kévin lui-même dans son coin, sans review.le 09/12/2019 à 9:22 -
VoyvodeMembre émériteC'est pourtant ce qui se passe tous les jours avec des boites comme Oracle et les patent trolls.
Le problème du code publié sur Stack Overflow est que son statut juridique n'est pas clair. Par défaut, il est sous une licence Creative Common (CC BY-SA 4.0) qui permet à priori de faire ce qu'on veut, aux conditions de citer l'auteur et, surtout, de publier les modifs sous la même licence.
Cela pose au moins deux problèmes :
- L'origine du code. Rien n'indique formellement que le code publié sur Stack Overflow n'a pas été piqué d'un code sous une licence plus restrictive. (Comme dans l'affaire Stallman/Gosling sur Emacs.) C'est rarement un problème pour des petites portions de code, mais ça reste théoriquement possible.
- La réutilisation de ce code. La CC BY-SA 4.0 est une licence « virale » comme la GPL-2.0, car elle t'oblige à conserver cette licence même si le code est modifié. Cela peut poser des problèmes quand tu l'intègres dans un code à licence différente, même considérée comme « plus libre ». La licence CC BY-SA 4.0 empêche que ton code soit intégré dans du code en licence propriétaire… mais aussi en licence MIT par exemple.
Il reste possible de mettre ce code dans une bibliothèque différente, mais ce n'est pas commode pour seulement 10 lignes.
Pour ne rien arranger, les licences Creative Common sont rarement utilisées avec du code. Stack Overflow envisage depuis 5 ans d'opter pour la licence MIT, mais entre les discussions houleuses et le flou juridique, le projet est au point mort.le 18/12/2019 à 15:32 -
sacdebilleMembre régulierCela soulève 2 problématiques :
- Peut insérer dans un projet du code pris sur Stack
- Le code de stack doit il etre validé lors des revue de code
Pour moi c'est clair, si un dev publie un code sur stack c'est pour gagner de la réputation, un meilleurs salaire ….
Et donc il accepte en contre partie que son code soit utilisé anonymement par un autre dev.
Quant à la validation, elle doit etre systématique pour tout code intégré au projet.le 06/12/2019 à 11:35 -
Pierre Louis ChevalierExpert éminent séniorCréer une prise de conscience sur le fait que copier coller du code pris sur le net n'est pas sans danger ?le 06/12/2019 à 16:41
-
defZeroMembre extrêmement actif1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// From: https://programming.guide/worlds-mos...o-snippet.html
public static strictfp String humanReadableByteCount(long bytes, boolean si) {
int unit = si ? 1000 : 1024;
long absBytes = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes);
if (absBytes < unit) return bytes + " B";
int exp = (int) (Math.log(absBytes) / Math.log(unit));
long th = (long) (Math.pow(unit, exp) * (unit - 0.05));
if (exp < 6 && absBytes >= th - ((th & 0xfff) == 0xd00 ? 52 : 0)) exp++;
String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
if (exp > 4) {
bytes /= unit;
exp -= 1;
}
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
}.
Et sinon, pourquoi la fonction (java.lang.)Math.log ne prend pas simplement en deuxième argument la base du logarithme ?le 06/12/2019 à 17:20 -
jcarbautMembre à l'essaiOu alors, au lieu de s'inventer des droits, on regarde la licence, ou pour simplifier :As noted in the Stack Exchange Terms of Service and in the footer of every page, all user contributions are licensed under Creative Commons Attribution-Share Alike. Proper attribution is required if you republish any Stack Exchange content.Dans le cas où vous effectuez un remix, que vous transformez, ou créez à partir du matériel composant l'Oeuvre originale, vous devez diffuser l'Oeuvre modifiée dans les même conditions, c'est à dire avec la même licence avec laquelle l'Oeuvre originale a été diffusée.
Conclusion, utiliser Stack Overflow pour apprendre des choses, ça va, copier du code, ça a des implications qu'il vaut mieux avoir en tête (voir aussi ceci). Inventer des « Et donc il accepte... » ce n'est pas sérieux du tout.
D'ailleurs, l'article de Lundblad explique que ça a failli poser un problème jusque dans l'OpenJDK (chercher « Fun side story »).
Soit dit en passant, l'entreprise derrière Stack Overflow a récemment (septembe 2019) changé unilatéralement sa licence pour passer de CC-BY-SA 3.0 vers CC-BY-SA 4.0. A priori elle n'en avait pas le droit, et c'est un sujet qui a provoqué pas mal de réactions dans la communauté Stack Overflow, et qui n'est toujours pas résolu à ma connaissance.
Dans le même genre, on ne peut pas faire tout et n'importe quoi avec les dépôts GitHub sous prétexte qu'on a le droit de forker : sans indication de licence, c'est à peu près le seul droit qu'on a.le 14/12/2019 à 1:23 -
Qu'en pensez-vous ?Copiez-vous aussi du code sur Stack Overflow pour vos projets de développement ?Peut-on s'en passer ? Si non, comment éviter de rendre vulnérable son application ?
Que les exemples ayant les meilleurs notes sont rarement les meilleurs mais qu'en fouinant plus on trouve des p'tits génies qui pondent des perles de propreté et d'efficacité.
Pour essayer de commettre le moins d'erreur possible je n'hésite pas à utiliser des logiciels d'analyse (souvent propriétaire) et je me documente beaucoup.
J'ai aussi tenté de me faire aider par des dev pro mais leur réputation est à la hauteur de ce que j'en ai vu, ce sont surtout les nana qui aident le plus/le mieux (encore merci à celles qui m'aident à progresser), les bonhommes préfèrent rabaisser et te dire que c'est de la merde pour se sentir plus grand (mais il y en a quand même des sympa).le 06/12/2019 à 10:37