Авторы анализатора PVS-Studio предлагают вам проверить свою внимательность и развлечься. Попробуйте быстро отыскать баг в фрагменте исходного кода и ткнуть в него мышкой.
Анализаторы кода работают без устали и умеют находить множество ошибок, которые сложно заметить. Мы отобрали несколько фрагментов кода, в которых выявили ошибки с помощью PVS-Studio. Все фрагменты взяты из известных Open Source проектов.
Предлагаем вам посоревноваться с анализатором в прозорливости и попробовать самостоятельно найти ошибки. Вам будет предложено 10 случайно выбранных заданий. За верный ответ начисляется одно очко, если баг найден в течение 1 минуты.
Ограничение в 1 минуту сделано для интереса. Иначе вы, скорее всего, верно найдёте и укажете каждую ошибку, так как фрагменты кода короткие. В любом случае относитесь к этому просто как к игре, а не как к настоящему тестированию программистских навыков у вас или ваших коллег :)
Когда нашли ошибку, выделите её кликом мышки и нажмите кнопку "Ответ". Бывает, что в коде есть сразу несколько мест, куда вы можете "ткнуть" — и ответ зачтётся как правильный. Поясним это на примере.
case FuriHalSubGhzPreset2FSKDev476Async:
preset_name = "FuriHalSubGhzPreset2FSKDev476Async";
break;
FURI_LOG_E(SUBGHZ_PARSER_TAG, "Unknown preset");
default:
Этот код взят из проекта FlipperZero. Анализатор PVS-Studio сообщает, что часть кода никогда не выполняется: V779 [CWE-561, CERT-MSC12-C] Unreachable code detected. It is possible that an error is present. subghz_i.c 44
Кто-то поспешил и использовал макрос логирования после оператора break. Или это следствие неудачного рефакторинга. В любом случае ошибка очевидна, но вот куда именно ткнуть мышкой – вопрос сложнее.
С одной стороны, в качестве ответа можно выбрать оператор break. Он расположен до макроса FURI_LOG_E и прерывает выполнение оператора switch. Значит, проблема здесь.
С другой стороны, можно выбрать макрос логирования. Ведь это недостижимый код.
Так как же быть? Очень просто. В данном случае правильным ответом будет считаться как выделенный оператор break, так и макрос FURI_LOG_E.
Думаем, правила понятны. Желаем вам удачи: начать игру.
Не забудьте, показать этот Quiz вашим коллегам! Развлекайтесь, и безбажного вам кода!
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Andrey Karpov. PVS-Studio's challenge: can you spot an error?.
Комментарии (15)
gnomeby
29.06.2022 12:28+7Слушайте, это великолепно. Нашёл для себя лучшее доказательство того, что Си++ не для меня. А можете сделать такое по всем языкам, которые вы поддерживаете?
Да и на собеседованиях можно юзать.
mayorovp
29.06.2022 13:09+5Ну опять та же самая проблема что и в прошлый раз. Я нашёл все ошибки, но только 4 из 10 раз тыкнул в правильное место.
Andrey2008 Автор
29.06.2022 14:29Очень сложно сделать так, чтобы было однозначно понятно куда нажать. Хотя мы старались. Пожалуйю надо будет про это отдельную статью написать.
ptyrss
29.06.2022 17:03+1Спасибо за тест, сложнее всего было понять где именно ошибка в паттерне вида
Для меня тут ошибка в лишней проверке, а не в вызове) но 10/10 со второй попытки.
*ptr
ptr -> call()
if (ptr)Deosis
30.06.2022 07:31UB в разыменовании нулевого указателя. Поэтому логично отмечать его.
8/10 На UB и ошибках копипасты.
nevack
29.06.2022 18:21@Andrey2008 а вы принимаете реквесты на проверку Open Source проектов?
Хотел бы предложить проверить https://github.com/transmission/transmission
Недавно проект переписали с C на C++, интересно посмотреть, какие ошибки были допущены.
alexeibs
30.06.2022 01:44Тест интересный, но минуты на вопрос маловато для вдумчивого чтения С++ кода. Все-таки способов выстрелить в ногу вагон и маленькая тележка
n3td0g
30.06.2022 13:13Нужна помощь с тем, как правильно ошибку указать =)
В первой задаче тыкнул на строчки в которых ошибка и которые мне выдали в ответе, но или я не на те места в этих строчках нажал или что-то еще.
Обидно, когда отвечаешь правильно, а в ответе пишут "Неправильно ! =("
datacompboy
От меня не понимает... Первые раз пять надо потыкать чтоб точность понять, потом запускать. Тыкать в ошибку на строке проще =)
datacompboy
Ещё сложно попадать куда надо с телефона. Но работает.
6/10 хотя я указал правильно на все ошибки =))