Игра PVS-Studio: найди ошибку в C++ коде
Авторы анализатора 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)


  1. datacompboy
    29.06.2022 11:28
    +2

    От меня не понимает... Первые раз пять надо потыкать чтоб точность понять, потом запускать. Тыкать в ошибку на строке проще =)


    1. datacompboy
      29.06.2022 13:00

      Ещё сложно попадать куда надо с телефона. Но работает.

      6/10 хотя я указал правильно на все ошибки =))


  1. gnomeby
    29.06.2022 12:28
    +7

    Слушайте, это великолепно. Нашёл для себя лучшее доказательство того, что Си++ не для меня. А можете сделать такое по всем языкам, которые вы поддерживаете?

    Да и на собеседованиях можно юзать.


    1. Andrey2008 Автор
      29.06.2022 12:57
      +4

      В процессе подготовка заданий для C# варианта.


  1. mayorovp
    29.06.2022 13:09
    +5

    Ну опять та же самая проблема что и в прошлый раз. Я нашёл все ошибки, но только 4 из 10 раз тыкнул в правильное место.


    1. Andrey2008 Автор
      29.06.2022 14:29

      Очень сложно сделать так, чтобы было однозначно понятно куда нажать. Хотя мы старались. Пожалуйю надо будет про это отдельную статью написать.


      1. ptyrss
        29.06.2022 17:03
        +1

        Спасибо за тест, сложнее всего было понять где именно ошибка в паттерне вида

        *ptr
        ptr -> call()
        if (ptr)

        Для меня тут ошибка в лишней проверке, а не в вызове) но 10/10 со второй попытки.


        1. Deosis
          30.06.2022 07:31

          UB в разыменовании нулевого указателя. Поэтому логично отмечать его.

          8/10 На UB и ошибках копипасты.


  1. savostin
    29.06.2022 15:12
    +2

    404 по всем ссылкам. Я опоздал?


    1. iwannabekoshka
      29.06.2022 15:57

      Попробуйте сейчас, больше не выдает 404-ю


  1. nevack
    29.06.2022 18:21

    @Andrey2008 а вы принимаете реквесты на проверку Open Source проектов?

    Хотел бы предложить проверить https://github.com/transmission/transmission

    Недавно проект переписали с C на C++, интересно посмотреть, какие ошибки были допущены.


    1. Andrey2008 Автор
      29.06.2022 19:40

      Спасибо за предложенный проект. Возможно посмотрим, но не обещаю.


  1. alexeibs
    30.06.2022 01:44

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


  1. a-tk
    30.06.2022 08:52
    +2

    Всё-таки к разметке ответов есть вопросы...


  1. n3td0g
    30.06.2022 13:13

    Нужна помощь с тем, как правильно ошибку указать =)

    В первой задаче тыкнул на строчки в которых ошибка и которые мне выдали в ответе, но или я не на те места в этих строчках нажал или что-то еще.

    Обидно, когда отвечаешь правильно, а в ответе пишут "Неправильно ! =("