Как стать автором
Обновить

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

Знаете, что __int64 может быть именем переменной?
int __identifier(__int64);


По-моему, в приведенном примере __int64 вовсе не имя переменной, а тип неименованного аргумента.
Имя переменной, будь оно не ладно:
int __identifier(__int64);
__identifier(__int64) = 1;
Хороший пример, когда, не зная брода, не стоит лезть в воду. :)
Экак Вы осутствие функционала прямо достоинством обернули. Вообще, во всех программах с плагинами действует принцип «Что в плагине написали — то и получили». Прикиньте, если бы разработчики браузеров там или IDE выбрасывали поддержку плагинов с аргументацией «а вдруг плагин может случайно плохо сделать».

И что вообще сложного в реализации этой штуки? Дали бы юзеру API с выходом лексического\синтаксического анализатора (не верю, что у Вас нету возможности дать эту информацию) и возможность написать что-то на выход. И пусть себе долбется с нулями в «037». И пофиг, что Ваши полные юнит-тесты найдут 100500 ложных срабатываний в Ваших 70 тестовых проектах. У юзера нет этих 70 проектов, а свои ложные срабатывания он и сам поправит, если захочет.
НЛО прилетело и опубликовало эту надпись здесь
1. Пользовательские правила не должны быть протестированы на 100% и вполне логично появление ложных срабатываний, но… они пишутся чаще всего для внутреннего пользования для проектов с единым стилем оформления кода, поэтому НЕ должно охватывать всевозможные варианты написания.
2. Вы можете создать сервис куда пользователи отправляют свои правила, так сказать на проверку. Выделите еще несколько машин или сервер на прогонку тестов. Вы сможете отображать пользователям информацию где может упасть их правило, они могут подсказать вам какие срабатывания ложные. Также можно сделать рейтинг правил для внесения в PVS и вы увидите что реально интересует пользователей, со временем появятся и те кто сможет писать правила хорошо — для вас это по сути бесплатный краудсорсинг.
3. по поводу прогонки тестов, зачем открывать Visual Studio? 4 часа достаточно много, уверен что можно уменьшить это время как минимум в 2 раза. SSD или RAM-диск тоже дает приличное ускорения для c++ проектов (на него также стоит вынести папку TEMP).
Сколько не смотрю на C++ всегда кажется что все проблемы имеют фундаментальный характер и бороться с ними по сути Сизифов труд, так хочется чистого языка без головоломных языковых/символьных конструкций. Ваш бы опыт в подобное русло :)
Чуть не пропустил новую статью в замечательном цикле про PVS-Studio из-за отсутствия лошадки-единорожки.
Еле глаз успел зацепить слово PVS, пока в консоли следил за сборкой LibreOffice.

А на какую тему будет следующая статья?
Просьба… проверьте в будущих статьях исходники какой-либо игры…

>> Чуть не пропустил новую статью в замечательном цикле про PVS-Studio из-за отсутствия лошадки-единорожки.

исправили картинку :-)

>> Просьба… проверьте в будущих статьях исходники какой-либо игры…

Принимаются заказы! Требования: код должен компилироваться в VS2005/2008/2010 (что-нибудь одно достаточно).
О! Протестируйте, пожалуйста, Orge3d — графический движок. Компилится в любой из представленных.
Посмотрел сейчас в нашей базе ошибок в реальных программах — мы его проверяли полгода назад (когда появилась только версия PVS-Studio 4.00 с анализатором общего назначения. Тогда мы нашли всего несколько ошибок не очень интересных.

Но, пожалуй, сейчас можно его перепроверить. Может быть уже и найдется что-то.

Принимаем еще заявки!
Как насчет quake3?
Думаю можно будет рассмотреть id Tech 4 и Doom 3 engine, когда их в опенсорс выложат.
Скорее всего, там мы уже ничего не найдем. Кармак уже давно играет с PVS-Studio и скорее всего эти проекты уже будут проверены и поправлены. А так идея хорошая. Кстати, Кармак обратил на нас внимание, именно после того, как в одной из статей мы упомянули, что нашли ошибки в уже открытых исходниках Wolfenstein 3D.
Прикольно, поздравляю вас )
НЛО прилетело и опубликовало эту надпись здесь
Тесты используется разные. Если говорить о внутренних тестах, то на каждое правило есть специальный размеченный фрагмент кода. Например, для рассмотренного правила по выявлению восьмеричных значений, тест выглядит так. Подобные размеченные тесты есть для всех диагностических правил. Плюс есть тесты на то, что мы разбираем разные хитрые конструкции. Пара примеров для ясности:
int TestMisplacedPrgama()
{
  do {} while((0,0)
  #pragma warning(pop)
  );
  return 1;
}

namespace testOrder2
{
  ...
  __w64 const static MyInt wa = 1;
  const __w64 static MyInt wa2 = 1;
  const static __w64 MyInt wa3 = 1;
  const static MyInt __w64 wa4 = 1;
  static const MyInt __w64 wb = 1;
  volatile static __w64 MyInt wc = 1;
  static __w64 volatile MyInt wd = 1;
  static MyInt __w64 volatile we = 1;
  const __w64 MyInt static wf = 1;
  const MyInt __w64 static wg = 1;
  __w64 MyInt static volatile wh = 1;
  __w64 extern MyInt volatile waa = 1;
  MyInt extern volatile __w64 wab = 1;
}

void TestThrow()
{
  int a;
  (a = 10, throw);
}


Объем тестов на правила и хитрые конструкции около 700 килобайт. Есть другие внутренние тесты, которые быстро проверяют, что в первом приближении ничего не сломалось. Это препроцессированные файлы, которые включают наиболее важные части библиотек (WinAPI, MFC, ATL, Boost и т.п.). Объем этих препроцессированных файлов 120 мегабайт.

Регрессионные тесты как уже говорилось, запускаются на 70 проектов. Объем исходного кода (*.h, *.c*) составляет порядка 400 мегабайт.

Есть еще другой набор тестов, который мы запускаем только иногда. Это еще около 400 мегабайт.

Есть и другие тесты. Например, PVS-Studio каждую ночь проверяет сам себя.
НЛО прилетело и опубликовало эту надпись здесь
Крутая штука этот ваш PVS-Studio. Сейчас меня закидают помидорами, но я поставил себе пиратскую версию 4.35, потому что я за свой опенсорс не получаю ни копейки, это для меня не работа, а лишние 3к евро на дороге не валяются.
Вопрос: куда можно пожаловаться на фалсалармы? Или лучше сразу застрелиться, утопиться и не трогать ваш чудо-анализатор своими грязными руками?
Кстати если хочется отблагодарить авторов, то можно написать статью. Мы готовы помочь с этим.
Знаете, что __int64 может быть именем переменной?
Тот, кто использует имена, содержащие __ или начинающиеся с _<Capital> — ССЗБ, потому как lib.global.names/1. Кстати, ваш анализатор может выдавать предупреждения в этих случаях.
Вы не уловили суть. То что — ССЗБ — это понятно. Но вот есть реальный работающий годами код, в котором это используется. Задача анализатора (и тесты позволяют быть в этом уверенным) — как минимум не упасть, а по-хорошему обработать такое имя переменной как и другие.

Мы же не можем падать со словами «ССЗБ» в креш-дампе…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории