Привет всем любителям побрейнштормить и хорошенько развлечься! Команда PVS-Studio на связи. Новый крутой квиз с интересными вопросами из мира программирования уже у нас на сайте. Да не простой квиз, а задачки от Сергея Кушниренко — разработчика игр в 4A Games! Если устали от рутинных задач и хотите поразмять мозг чем-то интересным, welcome!

Сначала была идея

Как появился этот квиз? Чисто случайно. Недавно наша команда наткнулась на две статьи от Сергея. В них автор предлагает поразмышлять над интересными и запутанными ошибками: некоторые из личной коллекции, скрупулёзно собранные за много лет практики; другие использовались Сергеем и его командой в разработанном им формате собеседования "Собес наоборот". Поверьте, ошибки непростые — там есть над чем поломать голову.

Когда разработчики из нашей команды прочитали статьи, идея квиза возникла сама собой. Мы написали Сергею, и он любезно согласился нам помочь. А дальше дело за малым — придумать варианты ответов на каверзные вопросы, оформить и представить читателям!

Пошаговая инструкция

Итак, разберём подробнее, как же вам поучаствовать в нашем квизе? Всё очень просто!

Шаг 1

Выдохните и сосредоточьтесь, вопросы будут не из лёгких. Если вы ответите на большинство из них без проблем, то вы явно высококлассный специалист, пишете много кода, да и вообще человек хороший. Сосредоточились? Тогда вперёд, на страницу квиза по этой ссылке!

Шаг 2

Страх и сомнения остались позади. Скорее жмите кнопку "Начать". Далее всё просто: читаете вопрос, выбираете вариант ответа, который считаете правильным, жмёте ответить. Если выбранный вами ответ стал зелёным — вы не ошиблись, если красным — не расстраивайтесь и смотрите на зелёный, он был верным.

Шаг 3

Ну вот и всё, настало время полюбоваться своими результатами. Делайте скрин и ставьте в рамочку, если ответили на все вопросы верно, и не расстраивайтесь, если результат оказался слабым. Эти задачи были действительно со звёздочкой.

А что в итоге?

Нашли все ошибки? Не расстраивайтесь, если нет. Наш анализатор поможет найти такие баги. Хотите проверить? У вас будет такая возможность: после прохождения квиза мы подарим вам бесплатную триальную лицензию на 30 дней. Попробуйте PVS-Studio на ваших проектах и испытайте его мощь в анализе кода :)

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

А если хочется ещё?

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

На этом на сегодня всё! А если хотите ещё немного развлечься, вас ждёт раздел развлечений на нашем сайте. Игры, викторины и квизы помогут с пользой скоротать свободное время. Заходите, не пожалеете!

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Boris Novoselov. A hard quiz to crack for C++ programmers by Sergei Kushnirenko.

Комментарии (22)


  1. Kelbon
    20.12.2023 09:07

    А? Чего? Точки с запятой нет после return, ну вероятно опечатка в квизе. У функции _fpzero перепутаны аргументы(кто бы ещё показал декларацию этой функции, а ещё что такое amount и eps... Этой информации просто нет)

    Оформление (подсветка синтаксиса? Форматирование?) не соответствует логике... Но тут даже нет логики....


    1. KanuTaH
      20.12.2023 09:07

      Ну почему, последний вариант ответа правильный. Будет вызвана setAnglesXYZ(), и ее "результат" (по всей видимостиvoid) будет возвращен. А по отступам-то и не скажешь.


      1. Kelbon
        20.12.2023 09:07

        А, госпади. То есть опечатки не было и они намекали, что return и на следующую строку съехало другое, понятно. Я расценил это как опечатку в квизе


      1. SalazarMAX
        20.12.2023 09:07

        Не знал, что так вообще можно писать в C/C++ (делать return void). Каждый раз, когда думаю, что C меня уже ничем не сможет удивить, то всё-таки удивляет.



  1. MiraclePtr
    20.12.2023 09:07

    спойлер, открывать только если уже прошли квиз

    11-ый вопрос - правильный ответ должен быть "программа не скомпилируется" (код полностью скопипастен и проверен на GCC, Clang и MSVC - действительно не компилируется), но в квизе почему-то правильным ответом считается "тут есть какой-то прикол".
    В разборе указано типа "тут у второй функции имя с другим юникодным символом" - но по факту в коде, приведенном в вопросе, символы ровно те же самые.


  1. Kelbon
    20.12.2023 09:07

    Кхм?

    я "предвидел" и вставил код через копи паст на годболт, чтобы поискать там неюникод символы. Их не оказалось, так что код компилироваться не должен (redefinition), я что-то упускаю?


    1. Andrey2008
      20.12.2023 09:07

      Это ограничения сайта при публикации статьи. Не будьте так строги. :)


      1. mkmax
        20.12.2023 09:07

        Это баг в продукте компании, которая специализируется на ловле багов. Не надо так. Что если вы и анализатор так же пишете?


        1. Andrey2008
          20.12.2023 09:07

          У нас сложная система публикации материала, включающая в себя собственный плагин для Word, конвертирующий специально оформленные документы в страницы сайта. Система предупреждает про неправильные написания терминов, названий проектов (свой словарь), символов (не используем табы в примерах кода), что в англоязычных материалах попали всякие русские (а, о), проверяющая корректность и доступность ссылок, размеры картинок (чтобы кто-то случайно не вставил фотку на 5 мегабайт) и ещё 100500 проверок. Можно сказать, что у нас ещё есть специализированный статический анализатор для документов :)

          И мы точно не будем проталкивать во всю эту экосистему этот экзотический Unicode символ, чтобы один пример в одном квизе стал чуть лучше. Лучше наоборот разумно ограничивать возможности, поддерживаемы символы и т.д. В общем, комментарий не принимаю :)


          1. qw1
            20.12.2023 09:07

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


          1. naviUivan
            20.12.2023 09:07

            Так вы же сами придумали пример с этим самым экзотическим Unicode символом, так почему бы не довести его до адекватного представления на сайте путем ручного редактирования документа после конвертирования?


  1. bfDeveloper
    20.12.2023 09:07

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


    1. MiraclePtr
      20.12.2023 09:07

      Вот да. Там на ряд вопросов с вариантами ответов "а) это правильный код б) это неуточненное поведение в) это неопределенное поведение" по факту правильным ответом должен быть "Вообще не важно, потому что это кривой код, который ни в одном приличном проекте не пройдет ревью и его надо переписать нормально".


      1. dalerank
        20.12.2023 09:07

        К сожалению, этот код писали люди, зачастую на отлов такой фигни было потрачено несколько часов моей жизни. К вопросу об её ограниченности. Хорошего кода конечно намного больше, но будет ли вам интересно читать про успешный успех успешно скомпиленного кода?


  1. AndreyYu
    20.12.2023 09:07

    Квиз: На первой картинке действительно вертикальные линии вогнуты?:-)


  1. maxood
    20.12.2023 09:07

    С передачей указателя на мьютекс - так себе квиз. Так никто не делает, и это задача на внимательность, которую даже clang-tidy может отловить (но не проверял)


    1. Andrey2008
      20.12.2023 09:07

      Относитесь проще. Всё это носит развлекательный характер, а не, например, для проведения собеседований :)


    1. MiraclePtr
      20.12.2023 09:07

      Я такую ошибку лично делал по невнимательности. Благо, анализатор поймал.


  1. hiewpoint
    20.12.2023 09:07

    В вопросе 18 второй ответ корректен не всегда, а только в случае, если данный контейнер действительно инвалидирует итератор после push_back, поэтому я выбрал ответ 1. Мы ничего не знаем ни про контейнер, ни про вызывающего эту функцию, там, например, может быть std::vector c capacity достаточным, чтобы поместить все новые элементы, гарантируя, что push_back не инвалидирует итераторы. Кроме того, это вообще очень странный вопрос, т.к. похоже, что это вообще что-то не из std, т.к. вроде бы итератор format внезапно имеет is_stereo в качестве члена, иначе его бы разыменовывали через ->, а не через точку.


    1. qw1
      20.12.2023 09:07

      Когда я проходил, там было написано

      std::vector<....> formats;
      

      видимо, дополнили.


  1. yrHeTaTeJlb
    20.12.2023 09:07

    https://en.cppreference.com/w/cpp/container/list/push_back

    No iterators or references are invalidated.

    С auto и без объявления formats невозможно сказать что будет с итераторами, и есть ли они там вообще.