Самый популярный пример Java-кода на StackOverflow оказался с ошибкой

Самый популярный пример Java-кода, опубликованного на StackOverflow, оказался с ошибкой, приводящей к выводу при определённых условиях неверного результата. Рассматриваемый код был размещён в 2010 году и накопил более тысячи рекомендаций, а также был скопирован во многие проекты и встречается в репозиториях на GitHub около 7 тысяч раз. Примечательно, что ошибку нашли не пользователи, копирующие данный код в свои проекты, а изначальный автор совета.

Рассматриваемый код осуществлял преобразование байтового размера в читаемую форму, например 110592 преобразовывал в »110.6 kB» или »108.0 KiB». Код был предложен как оптимизированный при помощи логарифмов вариант ранее предложенного совета, в котором величина определялась на основе последовательного деления исходного значения в цикле на 1018, 1015, 1012, 1019, 106, 103 и 100, до тех пор пока делитель больше исходного значения в байтах. Из-за неаккуратных вычислений в оптимизированном варианте (переполнение значения long) результат работы при обработке очень больших чисел (эксабайт) не соответствовал действительности.

Автор совета также попытался обратить внимание на проблему на копирование примеров без ссылки на источник и без указания лицензии. По данным ранее проведённого исследования 46% разработчиков скопировали код со Stack Overflow без указания автора, 75% не знали, что код распространяется под лицензией CC BY-SA, а 67% не знали что это подразумевает необходимость указания авторства.

По данным другого исследования, копирование примеров кода сопряжено не только с риском наличия в коде ошибок, но и уязвимостей. Например, проанализировав на StackOverflow 72483 примеров кода на C++, исследователи выявили серьёзные уязвимости в 69 примерах, входящих в список наиболее популярных рекомендаций. Проанализировав затем наличие этого кода на GitHub было выявлено, что скопированный со StackOverflow уязвимый код присутствует в 2859 проектах.

Источник: http://www.opennet.ru/opennews/art.shtml? num=51982

©  OpenNet