Грустный единорог
Наша компания (ООО «СиПроВер», разработчик PVS-Studio) провела на конференции SECR2015 конкурс. Суть конкурса была в нахождении наиболее интересной ошибки в своём коде. На самом деле рассказать, в общем-то, не о чем, так как в конкурсе принял участие ровно 1 человек. Тем не менее, ряд людей попросили рассказать, чем закончился конкурс, и я решил написать малюсенькую заметку на эту тему.

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

Первой целью конкурса было, чтобы некоторые из участников конференции наконец победили лень и решились попробовать PVS-Studio на своих проектах. Как обстоит с этим дело, нам неизвестно.

Второй целью конкурса было собрать примеры кода с ошибками и написать интересную статью. Мы понимали, что не все захотят показать свой код на публику. Таким людям мы хотели предложить модифицировать код до неузнаваемости. Ну или про них мы вообще могли бы не писать, но они бы всё равно приняли участие в конкурсе. Победители награждались призами (различными Gift Cards). К сожалению, с этой задачей точно не заладилось.

Итак, конкурс завершен и пора подвести итоги. Участие в конкурсе принял один-единственный человек. Он автоматически становится победителем. Поприветствуем его:

Алексей Дроздов, компания [удалено].

Проверив один из проектов компании, он заметил интересную ошибку, связанную с использованием несуществующего буфера. Благодаря везению, ошибка никак не проявляет себя, но баг всё равно остаётся багом. Суть ошибки демонстрирует следующий псевдокод:
const char* ptr = nullptr;
while (p < end)
{
  const unsigned int uc = GetValue(*p++);
  switch (uc)
  {
    case 1: ptr = "a"; break;
    case 2: ptr = "b"; break;
    case 3: ptr = "c"; break;
    default:
    {
      char buffer[0x100];
      ...
      ptr = buffer;
    }
  }
}

if (ptr)
  result = ptr;

// после чего указатель 'result' используется для
// хранения данных

Ошибка выявлена благодаря диагностике V507. Программа использует буфер, который перестаёт существовать после выхода из default-блока. Однако этот код старый и успешно работал уже N-лет. Всё дело в везении. Visual C++ при входе в функцию выделяет в стеке место сразу под все массивы/переменные и не переиспользует выделенную память. Однако, как Вы понимаете, это везение до поры до времени.

Благодарим Алексея и вручаем ему приз (подарочную карту на $200).

P.S. На данный момент проходит новый конкурс "Photo casting with PVS-Studio unicorn". В двух словах: предлагаем сфотографироваться с нашим единорогом и поучаствовать в конкурсе фотографий. Приглашаю всех наших фанатов поучаствовать.
Стоит ли повторить конкурс, подобный тому, что мы организовывали на SECR2015, но более широковещательно? Кто из присутствующих готов прислать нам фрагмент своего кода с ошибкой для участия в конкурсе?

Проголосовало 98 человек. Воздержалось 132 человека.

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

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


  1. Stalker_RED
    06.11.2015 15:10
    +3

    >> Хочу посмотреть результат голосования.
    для этого есть кнопка «Воздержаться»


    1. Andrey2008
      06.11.2015 15:11
      +3

      Как говорится, первое голосование комом. Теперь уже поздно.


  1. icCE
    06.11.2015 18:28

    Кстати, нет желание продолжить исследование исходных кодов microsoft dos / word?

    geektimes.ru/post/217081/#comment_7436169

    Некрофилия конечно, но все же интересно.


    1. Andrey2008
      06.11.2015 20:04
      +1

      Занимательная археология. Или PVS-Studio проверяет Microsoft Word 1.1a.

      И ещё, где можно покопаться и найти интересное: www.viva64.com/ru/a/0084


      1. icCE
        06.11.2015 21:41

        О спс. Видно пропустил.


    1. MacIn
      07.11.2015 01:53

      исходных кодов microsoft dos

      То ж на ассемблере.