Наша компания (ООО «СиПроВер», разработчик 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". В двух словах: предлагаем сфотографироваться с нашим единорогом и поучаствовать в конкурсе фотографий. Приглашаю всех наших фанатов поучаствовать.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
ссылка на оригинал статьи http://habrahabr.ru/post/270315/
Добавить комментарий