LINUX.ORG.RU
ФорумTalks

Сыграйте в игру: найдите ошибки в известных открытых проектах (для Си/Си++ программистов)

 , , ,


0

1

Авторы анализатора PVS-Studio предлагают программистам проверить свою внимательность и попробовать найти ошибки в фрагментах Си/Си++ кода.

Анализаторы кода работают без устали и умеют находить множество ошибок, которые сложно заметить. Мы отобрали некоторые фрагменты кода, в которых мы выявили ошибки с помощью PVS-Studio.

Тест не предназначен для тестирования глубины знания языка Си++. Для этого есть другие хорошие и интересные тесты. Например, можно рекомендовать этот C++ Quiz. Наш же тест сделан for fun.

Мы часто слышим от людей, что анализатор кода — это бессмысленный инструмент. Не там поставленную скобку или запятую можно найти за 5 секунд. А сложные алгоритмические ошибки анализатор не найдёт. Поэтому, максимум кому полезен инструмент, это студенты.

Мы решили потроллить таких людей. В тестах сделано ограничение по времени. Предлагаем им найти ошибку за тем самые 5 секунд. Хорошо, не 5 секунд, а за минуту. Будет предложено 15 случайно выбранных заданий. За верный ответ насчитывается одно очко, если он дан в течение 1 минуты.

Хотим подчеркнуть, речь идёт не о синтаксических ошибках. Все фрагменты взяты из известных Open-Source проектов, которые успешно компилируются. Рассмотрим пару примеров с ошибками и объясним, как указывать правильный ответ.

Пример первый.

Здесь ошибка выделена красным. При решении задач этого, конечно, не будет.

Программист случайно опечатался и вместо индекса 2 написал 3. При движении курсора мышки над кодом будут подсвечиваться различные слова и цифры. Вы должны навести курсор на число 3 и нажать левую кнопку мыши.

Это будет правильный ответ.

Не всегда можно однозначно указать, где ошибка:

Второй пример.

Размер буфера нужно сравнить с числом 48. Случайно в код затесался лишний оператор sizeof(). В результате, размер буфера сравнивается с размером типа int.

На мой взгляд, ошибкой является оператор «sizeof», и именно на него надо указать мышкой. Однако, не имея перед глазами весь текст программы, можно рассудить так. Оператор 'sizeof' должен был посчитать размер какого-то буфера, но ему случайно подсунули макрос. Ошибкой является использование «SSL3_MASTER_SECRET_LENGTH».

Для таких случаев ответ будет засчитан, как верный, независимо от того, выберете вы «sizeof» или «SSL3_MASTER_SECRET_LENGTH».

Желаем успехов! Вы можете начать игру.

Примечание.

Тест не рассчитан на мобильные устройства. Тыкая пальцем очень легко промахнуться. Мы готовим новую версию тестов, где лучше поддержим мобильные устройства, сделаем новый задания и так далее. Но пока этого нет. Предлагаем подписаться на твиттер, чтобы быть в курсе что у нас нового, интересного, и что вообще происходит в мире Си++.

Подробности

Перемещено anonymous_incognito из opensource

эти пвс-студио на хабрахабре уже весь с++ хаб заспамили, теперь и сюда пролезли
и раздел open source - это смешно, у пвс-студио в триал-версии ограничение на число кликов (20, кажется) в таблице

basp ()
Последнее исправление: basp (всего исправлений: 1)
Ответ на: комментарий от basp

Мы (и я в частности) сделали для open-source намного больше, чем здесь присутствующие :). Мы проверили уже более 200 открытых проектов и уведомили авторов о результах. О некоторых проверках есть интересный и полезные статьи: http://www.viva64.com/ru/a/0084/

P.S. Не 20 кликов, а 100. Это повод пообщаться и попросить ключ на время, а не ограничение.

Andrey_Karpov_2009 ()
Ответ на: комментарий от Andrey_Karpov_2009

С одной стороны, вы действительно сделали очень много полезного для OSS, но с другой, ваш маркетинг достаточно агрессивен, а цены высоки, вы будто не от чистого сердца хотите помочь OSS, как энтузиасты OSS, а делаете это только ради того, чтобы привлечь людей и заработать денег на своем проприетарном продукте (может Coverity тоже преисполнены корыстных целей, но они сделали удобный, открытый и безлимитный для любого сервис про проверке любых OSS проектов, что выгодно отличает их проверки от вашего). Из-за этого и летят комья грязи в вашу сторону от людей, которые не вполне понимают пользу вашей работы или ЦА вашего анализатора (про CppCat знаю). Еще не забывайте где мы находимся. :)

Тем не менее, хочу отметить несомненную пользу вашей работы, ваши анализы интересно читать, а ошибок в OSS меньше — это всегда хорошо.

// сам использую cppcheck, статический анализ — это круто

anonymous ()
Ответ на: комментарий от anonymous

Спасибо за хорошие слова.

Маркетинг «суровый и бородатый», так как им занимаются программисты (например, я). Мы бы рады продвигать идеологически правильно как все, но не получатся. Продажники (менеджеры, маркетологи) у нас не приживаются. Пока ни один не прижился. Никто не может разобраться что мы делаем и как это продать другим программистам. Понятно, что такие люди есть, но где из взять в Туле непонятно :). А с Москвы мы такого продвинутого человека не потянем сманить.

И да, мы помогаем Open-Source из корыстных соображений. Как и другие 90% кто помогает. Например, сидит человек в Intel на зарплате и занимается Open-Source. Он то «бескорыстен», но зарплату ему платят для поддержки какого-то Open-source проекта весьма не просто так. :) Да и тот-же Coverity имеет грант от министерства обороны чтобы возиться с Open-Source. Дал бы кто нам денег, мы бы тоже так помогали :)

Andrey_Karpov_2009 ()
Ответ на: комментарий от Lincor

Ошибки больше на внимательность, чем на знания. Многие из них свойственны для разных языков. Так что тест вполне можно неплохо пройти, не зная именно С++, но зная скажем C#. Вот с настоящим тестом (ссылка в начале) так не выйдет. Кстати знатокам C++ рекомендую. Очень хорошие задачки.

P.S. Кто ни будь заапрувит мой пост или не судьба?

Andrey_Karpov_2009 ()
Ответ на: комментарий от Andrey_Karpov_2009

большинство ошибок там чисто сишные. C# и другие современные языки таким не страдают.

Lincor ()

Андрей, рад, что Вы вернулись.

Все еще в состоянии восторга от Вашей презентации на конференции по плюсам в Москве.

C++ знаю, конечно, так себе, но такая «игра» выглядит вполне даже интересной и познавательной.

kachsheev ★★★ ()
Последнее исправление: kachsheev (всего исправлений: 1)

Потыкал, получил мало очков, т.к. не всегда понятно куда именно тыкать. Я вижу проблемное место, клацаю, а оно говорит INCORRECT и надо было клацнуть следующий символ или что-то подобное.

RevenantX ★★★★ ()
Ответ на: комментарий от RevenantX

Да, иногда можно не угадать куда кликнуть, хотя ошибка понятна. Однако, если делать правильным ответом сразу несколько слов/символов или всю строку то будет неинтересно. Слишком короткие примеры. Легко угадать случайно.

Andrey_Karpov_2009 ()
Ответ на: комментарий от int13h

Пока мы считаем, что в этом для нас пока нет смысла. Некоторым открытым бесплатным проектам мы дарим лицензию PVS-Studio. Индивидуальным разработчикам мы придумали предлагать обмен. Даём им PVS-Studio на 2 недели. Они пробуют, проверяют и т.д. и пишут заметку. А мы за это им лицензию. Но пока прецедентов не было.

Выпустив какую-то бесплатную версию, мы прибавим себе работы с поддержкой, но ничего не получим.

Вообще это большая тема. Завтра-послезавтра приходите на Хабр. Будет большая буча и кидание ******* :), ибо мы к сожалению, пришли к выводу, что придётся свернуть направление с дешёвым CppCat. Будет интересная статья на эту тему и обсуждение.

Andrey_Karpov_2009 ()

Первый же вопрос выдал вот это.

V597 The compiler could delete the memset function call, which is used to flush final buffer. The RtlSecureZeroMemory() function should be used to erase the private data. md5.c 342

A buffer containing private data should be erased before function returns. The memset() function is used for this task, but it is incorrect. As compiler is aware that after calling memset() the 'final' buffer will not be utilized anymore, it is possible that compiler will remove memset() call altogether. Even more, it will certainly do it for release build. You can find more details on this topic in the 'Overwriting memory - why?' article and in the description of V597 diagnostic. Therefore, special functions should be used which cannot be removed by a compiler.

Я, кажется, уже писал об этом в каком-то треде про этот ваш PVS-Studio, но, если компилятор удаляет вызов memset, то это очень дерьмовый компилятор, и, наверное, стоит съездить к разработчикам этого чуда в гости и из любви к человечеству набить им рожи, чтобы они больше такого не делали.

hateyoufeel ★★★★★ ()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от Andrey_Karpov_2009

Выпустив какую-то бесплатную версию, мы прибавим себе работы с поддержкой

Зачем же мучаться? Сделайте unsupported, только с приемом багов =)

int13h ★★★★★ ()
Ответ на: комментарий от hateyoufeel

Это неконструктивный подход. Современные компиляторы делают это не из вредности, а в силу попыток построить быстрый и эффективный код. Компиляторы делают втихую очень много таких вещей, выбрасывая ненужный код, но обычно это не заметно. Иногда, как например с memset() это порождает негативные последствия. Но ещё раз повторю, это не единственный пример. Аналогичная ситуация, например, с удалениями проверок вида if (this), так как this теперь по стандарту не может быть равен nullptr.

Кстати, memset() это совершенно реальная БОЛЬШАЯ проблема в безопасности. Предлагаю познакомиться поподробнее с сутью: http://www.viva64.com/ru/k/0041/ , http://www.viva64.com/ru/d/0208/ .

Однако, руганью здесь не поможешь. Выход один. Быть в курсе как устроен мир и использовать на максимум предупреждения компиляторов и статических анализаторов.

Andrey_Karpov_2009 ()
Ответ на: комментарий от int13h

Со стороны это непонятно, но я знаю, что это потребует существенных вложений даже на такую поддержку. Как правило каждое обращение требует разбирательства, переписки с человеком. Это очень дорого, учитывая, что только программист может заниматься такой поддержкой.

Что-бы было понятно, продемонстрирую на одно конкретном примере.

Пишет человек. Говорит, что он студент и решил прогнать какой-то свой проект через PVS-Studio. И вот нашел несколько ошибок в анализаторе. Мол вот здесь возникает ложное срабатывание. Смотрю на код. Ничего не понимаю. Прошу уточнить. Получаю более большой фрагмент кода. На первый взгляд ложное срабатывание, но я уверен, что анализатор не мог так ошибиться. Выпрашиваю полный *.i файл. Изучаю его. Понимаю, что анализатор прав. Оказывается, что это *.c файл и зовётся функция, которая не объявлена. В результате компилятор посчитает что функция вернёт int. Самые настоящие ошибки и анализатор молодец, что нашёл их. Что-бы было понятнее предлагаю прочитать вот эту заметку Красивая 64-битная ошибка на языке Си. В данном случае ошибка была другая, но смысл тот-же самый.

Пишу разъяснительное письмо, где рассказываю почему анализатор выдал предупреждения и в чём ошибка. Человек в восторге. Он благодарен. Говорит не знал про такой вид ошибок. Мол спасибо, пойду исправлю.

Что имеем в сухом остатке. На переписку и разбирательства я потратил около 1 часа рабочего времени. Пользы никакой. Человек благодарен, но благодарность на хлеб не намажешь. А клиентом если он и захочет стать, то это будет ой как ни скоро. А ведь это только один feedback. Сделав что-то массовое и бесплатное, мы только и будем что-то разъяснять людям разные моменты в письмах.

Если мы просто не будем никому отвечать, то прослывём полными му*****. Мол им про ошибку пишут, а они молчат. Так что лучше не будем мы бесплатное делать. Не доросли мы ещё до такого уровня.

Andrey_Karpov_2009 ()

11/15 + один пример, в котором система меня не поняла. Только это всё бесполезно, половину этих ошибок я бы на code review пропустил, если каждый день так внимательно читать код, свихнуться можно.

Gvidon ★★★★ ()
Ответ на: комментарий от Andrey_Karpov_2009

RtlSecureZeroMemory()
RtlSecureZeroMemory()
RtlSecureZeroMemory()

Уходи.

alegz ★★ ()
Ответ на: комментарий от Andrey_Karpov_2009

Современные компиляторы делают это не из вредности, а в силу попыток построить быстрый и эффективный код.

Современные компиляторы удаляют необходимый для корректного поведения программы код только по одной причине: из-за превышения допустимого уровня каловых масс в черепных коробках разработчиков этих самых компиляторов.

Кстати, memset() это совершенно реальная БОЛЬШАЯ проблема в безопасности. Предлагаю познакомиться поподробнее с сутью: http://www.viva64.com/ru/k/0041/ , http://www.viva64.com/ru/d/0208/ .

Да, это одна из причин, почему в проекте OpenBSD используют свой особенный GCC, который не удаляет вызовы memset. И ещё, как минимум одна дыра в ядре лялекса была связана с тем, что gcc выпиливал код, инициализирующий структуру.

Проблема тут в том, что, например, в линуксовых ядре и юзерспейсе нет других функций кроме memset (да и зачем бы они нужны?), bzero не считается.

Однако, руганью здесь не поможешь.

Если ругаться с нужными людьми (в данном случае, разработчики компилятора), то ещё как поможешь.

Быть в курсе как устроен мир и использовать на максимум предупреждения <...> статических анализаторов.

Это типа такая ненавязчивая реклама? :)

hateyoufeel ★★★★★ ()
Ответ на: комментарий от Gvidon

Вот. Именно поэтому и следует использовать статические анализаторы кода, которые находят такие ошибки. Например, PVS-Studio. :) Главное выполнять проверки регулярно, а не раз в неделю/месяц.

Andrey_Karpov_2009 ()
Ответ на: комментарий от anonymous

но с другой, ваш маркетинг достаточно агрессивен,

Будь у российских IT-компаний побольше такого маркетинга, мы бы были известны не только 3.14дарасом Касперским.

atrus ★★★★★ ()
Ответ на: комментарий от Andrey_Karpov_2009

Омерзительно. Вместо того, чтобы выпиливать костыли 40-летней давности (та же модульность через хидеры и объектные файлы - это лютый шлак) и использовать адекватные средства разработки, люди тратят свои время и деньги на вот такие вот чудовищные костыли типа вашего PVS-Studio.

hateyoufeel ★★★★★ ()

Прикольно потыкать. Да, каждый раз так вчитываться в код - тронуться можно. Тут, наверное, нужны какие-то анализаторы. Немножко огорчают те места, где нужно угадать на какой именно символ указать. Хотя, сдругой стороны, не так уж и страшно. Все равно же видно прав ты был или нет.

sehellion ★★★★★ ()
Ответ на: комментарий от EXL

Например, языки, написание кода на которых в 2015 году не требует плясок с препроцессором или погружения в ад и израиль ручного управления памятью для банальной работы со строками.

hateyoufeel ★★★★★ ()

А в чём смысл рекламироваться на linux.org.ru? Вроде бы ваш продукт нацелен в основном на Windows?

Ещё вопрос. У вас на сайте есть хорошая подборка находимых ошибок (http://www.viva64.com/ru/d/). Как вы отреагируете, если кто-то займётся реализацией их детектирования в, скажем, cppcheck?

i-rinat ★★★★★ ()
Ответ на: комментарий от hateyoufeel

Например, языки, написание кода на которых в 2015 году не требует плясок с препроцессором или погружения в ад и израиль ручного управления памятью для банальной работы со строками.

Отличная идея. Осталось только переписать на них текущую кодовую базу C/C++. На чём ты предполагаешь переписать ядро линукса?

true_admin ★★★★★ ()
Ответ на: комментарий от i-rinat

Вроде бы ваш продукт нацелен в основном на Windows?

Ты всё правильно понял на счёт посетителей этого ресурса :).

true_admin ★★★★★ ()
Ответ на: комментарий от Andrey_Karpov_2009

Вообще это большая тема. Завтра-послезавтра приходите на Хабр. Будет большая буча и кидание ******* :), ибо мы к сожалению, пришли к выводу, что придётся свернуть направление с дешёвым CppCat.

А хотя зачем тянуть. Да начнётся флейм. :) Мы закрываем проект CppCat - http://habrahabr.ru/company/pvs-studio/blog/256637/

Andrey_Karpov_2009 ()
Ответ на: комментарий от sehellion

Тут, наверное, нужны какие-то анализаторы.

Я так понимаю, что это троллинг. Но я воспользуюсь случаем побыть капитаном и вставить пару ссылок.

Мы разрабатываем, продвигаем и продаём статический анализатор кода PVS-Studio. Одним из способов рекламы является бесплатная проверка открытых проектов. По результатам поверки мы пишем статьи. И нам польза, и сообществу.

Со временем у нас появилась база ошибок, которые нашёл инструмент PVS-Studio в различных проектах. Её можно по-разному использовать. Например, студенты могут написать статью. А мы придумали тест на внимательность.

Это и забавно и дополнительная реклама. Посетителям предлагается найти ошибку, которую смог найти анализатор кода. Так что Вы правы, без статических анализаторов искать подобное весьма непросто.

Andrey_Karpov_2009 ()
Ответ на: комментарий от true_admin

Тебе лишь бы всё переписать, онанюга пятизвездочный. Оставь ведро в покое.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от i-rinat

А в чём смысл рекламироваться на linux.org.ru? Вроде бы ваш продукт нацелен в основном на Windows?

Ой, один раз решил написать. Прям уж реклама. :) Тем более ведь это действительно интересно. Линуксойды тоже люди. Возможно кто-то работает над Windows проектами. Так что какая-то польза может и быть.

Как вы отреагируете, если кто-то займётся реализацией их детектирования в, скажем, cppcheck?

Ради бога. Кстати, кое-что они у нас уже брали. Но я не вижу в этом угрозы. Многие наши диагностики просто нереализуемы в рамках инфраструктуры Cppcheck. Да и не стоит недооценивать документацию, поддержку. «Посмотреть в исходный код и поправить» для компаний часто вариант так себе.

Andrey_Karpov_2009 ()
Ответ на: комментарий от Andrey_Karpov_2009

Мы (и я в частности) сделали для open-source намного больше, чем здесь присутствующие

Я вот патчи в половину свободных проектов написал. А чем можешь похвастаться ты, мальчик, кроме неудачной попытки сделать coverity?

kirk_johnson ★☆ ()
Ответ на: комментарий от kirk_johnson

Ну зачем же так зло? Мне вот тест понравился. И статьи у них интересные.

Что касается «неудачной попытки», то расскажи нам чем она неудачная. Желательно в примерах.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Тем, что Coverity уже есть, его использует NASA для верификации кода, он бесплатен для OSS (в том числе интеграция с github) и им частенько проверяют ядро, находя в нём реальные баги, а не использование memset() по назначению.

kirk_johnson ★☆ ()
Ответ на: комментарий от kirk_johnson

1) Coverity стоит гораздо дороже, а-ля 20штук баксов

2) мало ли кто что использует, я хочу видеть подробное сравнение продуктов.

3) Я рад что оно доступно для гитхаба. Это плюс. Но для тех у кого есть деньги чтобы купить коммерческую лицензию это не есть решающий фактор.

использование memset() по назначению.

Я начинаю сомневаться в твоей адекватности.

true_admin ★★★★★ ()
Ответ на: комментарий от bekon33

3.14 сюда не лезет со своим маркетингом, может он не такой уж и 3.14?

Он регулярно и последовательно выступает на всех доступных уровнях за тотальный контроль интернета, а закончил тем, что теперь ему все операционки от венды до линукса не годны, нужна новая, надёжная.

Так, что да. Наверное не такой уж.

atrus ★★★★★ ()
Ответ на: комментарий от true_admin

3) Я рад что оно доступно для гитхаба. Это плюс. Но для тех у кого есть деньги чтобы купить коммерческую лицензию это не есть решающий фактор.

Coverity, Inc., today announced that the NASA Jet Propulsion Laboratory (JPL), builder of the Curiosity Rover, used Coverity to help ensure the reliability of the mission-critical flight software guiding the successful landing of Curiosity on Mars.

А вот это?

kirk_johnson ★☆ ()

Спасибо, делаете интересное дело.

Жаль, что привязаны к windows. Имхо, правильное направление - инструменты на основе clang.

unsigned ★★★ ()
Ответ на: комментарий от kirk_johnson

Мне не интересен маркетинг (помимо того что использование русского проприетарного софта у американской госсударственной компании маловероятно). Ты можешь привести какие-то объективные доводы в пользу своей теории? Я вижу что нет.

Не вижу повода продолжать переписку.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Coverity используют ребята из Linux, CERN и NASA. Для проверки mission critical кода. Потому что он лучше ищет баги и возможные ошибки. Какие тебе ещё теории нужны? PVS studio используют 3.5 русских нищеброда под винду, у которых нет денег на Coverity, но которые не знают про clang, который тоже умеет статический анализ.

kirk_johnson ★☆ ()
Ответ на: комментарий от kirk_johnson

Я вот патчи в половину свободных проектов написал. А чем можешь похвастаться ты, мальчик, кроме неудачной попытки сделать coverity?

Можем похвастаться созданием компании, которая показывает рост (сейчас нас 12 человек). А если про открытые проекты, то сейчас в базе содержится 1873 примеров подозрительного кода. Половина это точно ошибки, остальное, как минимум, пахнущий и ненадёжный код. Только не надо про то, что мы должны были 1873 патча отправить. С этим хорошо справляются разработчики и благодарны нам.

Andrey_Karpov_2009 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.