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

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

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

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

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

Источник: opennet.ru

Добавить комментарий