Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

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 , par Bill Fassinou

25PARTAGES

22  0 
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.

Code : Sélectionner tout
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 : Sélectionner tout
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 ?

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

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de OButterlin
Modérateur https://www.developpez.com
Le 06/12/2019 à 18:29
Citation Envoyé par Pierre Louis Chevalier Voir le message
Créer une prise de conscience sur le fait que copier coller du code pris sur le net n'est pas sans danger ?
Ce 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...
7  0 
Avatar de Tahrky
Membre régulier https://www.developpez.com
Le 06/12/2019 à 10:54
Citation Envoyé par Bill Fassinou Voir le message

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.
J'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 ?
3  0 
Avatar de Voïvode
Membre émérite https://www.developpez.com
Le 06/12/2019 à 23:40
Citation Envoyé par defZero Voir le message
Çà pique les yeux .
Oui, c'est moche à voire.

En remplaçant &nbsp; 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.
2  0 
Avatar de yahiko
Rédacteur/Modérateur https://www.developpez.com
Le 09/12/2019 à 9:22
Je 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.
2  0 
Avatar de sacdebille
Membre régulier https://www.developpez.com
Le 06/12/2019 à 11:35
Citation Envoyé par Tahrky Voir le message
J'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 ?
Cela 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.
2  1 
Avatar de Pierre Louis Chevalier
Expert éminent sénior https://www.developpez.com
Le 06/12/2019 à 16:41
Citation Envoyé par gallima Voir le message
Je vois mal l’enjeu de ce thread, promouvoir de la validation de code par des entreprises externe ? Interdire Stack Overflow ?
Créer une prise de conscience sur le fait que copier coller du code pris sur le net n'est pas sans danger ?
3  2 
Avatar de defZero
Membre confirmé https://www.developpez.com
Le 06/12/2019 à 17:20
1
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&nbsp;? 1000&nbsp;: 1024;
long absBytes = bytes == Long.MIN_VALUE&nbsp;? Long.MAX_VALUE&nbsp;: 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&nbsp;? 52&nbsp;: 0)) exp++;
String pre = (si&nbsp;? "kMGTPE"&nbsp;: "KMGTPE").charAt(exp - 1) + (si&nbsp;? ""&nbsp;: "i");
if (exp > 4) {
bytes /= unit;
exp -= 1;
}
return String.format("%.1f&nbsp;%sB", bytes / Math.pow(unit, exp), pre);
}
Çà pique les yeux .
Et sinon, pourquoi la fonction (java.lang.)Math.log ne prend pas simplement en deuxième argument la base du logarithme ?
1  0 
Avatar de jcarbaut
Futur Membre du Club https://www.developpez.com
Le 14/12/2019 à 1:23
Citation Envoyé par sacdebille Voir le message
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.
Ou 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.
Eh non, vous n'avez pas le droit de réutiliser le code copié sur Stack Overflow sans citer la source. Ça peut même poser de sérieux problèmes, puisque la CC-BY-SA impose :

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.
Cela dit, la CC-BY-SA 4.0 est apparemment compatible avec la licence GPLv3.

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.
1  0 
Avatar de Voïvode
Membre émérite https://www.developpez.com
Le 18/12/2019 à 15:32
Citation Envoyé par sacdebille Voir le message
Donc j’ai un peu de mal (sur un site comme DVP) à me faire bahuter par quelqu’un qui ne semble pas vraiment intéressé ni impliqué par le développement.
C'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 :
  1. 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.
  2. 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.
1  0 
Avatar de
https://www.developpez.com
Le 06/12/2019 à 10:37
Qu'en pensez-vous ?
Qu'en tant qu'autodidacte j'y passe beaucoup de temps quand je dev dans un nouveau langage (en plus de divers git), j'ai rarement vu des tutos complet qui m'ont fait apprendre ou avancer.

Copiez-vous aussi du code sur Stack Overflow pour vos projets de développement ?
Ça m'est arrivé, les maths ne sont pas mon fort et parfois y'a pas le choix. Sinon je décompose comme le ferait un automate basique, c'est pas très efficace mais sinon ça fonctionne très bien.

Peut-on s'en passer ? Si non, comment éviter de rendre vulnérable son application ?
Perso j'ai apprit très vite que la qualité des exemples n'est pas forcément très bonne mais ça fournit une bonne piste quand on ne sait pas encore ce qu'on cherche.
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).
1  1