Pull to refresh

Comments 48

А зачем PVS-Studio дублировать ошибки, найденные компилятором? Вопрос, конечно же, касается только тех случаев, где VS2010 нашел что-то, а PVS-Studio нет.
Конечно же незачем, пока не мере для PVS-Studio, которая сидит над VS. Для компиляторо-независимых анализаторов будет сложно выявить какой компилятор какое предупреждение выдает (как минимум).
А где вы здесь увидели хотя бы одну ошибку, найденную компилятором? Я вижу только универсальные замечания о постфиксе _s, хотя все эти функции абсолютно безопасны при правильном использовании (пример небезопасной функции — gets, а не fopen).
А их здесь и нет. По делу только «uninitialized local variable».
Если не видно разницы, зачем платить больше?
UFO just landed and posted this here
По поводу VS Express. Тоже хотел попробовать этот анализатор на одной нашей либе, но к сожалению на странице загрузки PVS-Studio указано:
IDE: Microsoft Visual Studio 2005/2008/2010 (кроме Express Edition).
Сам на c++ не пишу (пока только интерес), поэтому и покупать/ломать VS выше Express нет желания.
UFO just landed and posted this here
Спасибо за совет. Будет время — попробую. Я не студент, но моя текущая работа связана с Delphi+Firebird. На С написана наша udf (в ее написании не участвовал), которая на 64-разрядной системе имеет ряд багов. Она несколько в запущении, на ее поддержку времени не выделяется вовсе. Хотел поковыряться, ради саморазвития.
студент? Пользуйся VS2010 Professianl бесплатно через дримспарк
А если компании больше 3-x лет — то до 5 лет или в особо тяжких случаях до 6 лет.
На Express Edition не работаю аддоны, чем и является PVS-Studio
Ну и на торрентах лежат нормальные версии c рассылки MSDN, полнофункциональные и не требующие кряка.
Можно подумать — это легальный способ! Какая разница использовать крякнутый или нормальный с торрентов, когда по-любому не платишь.
Ну тут даже дело не в легальности, а в адекватности работы программы. Крякнутая версия может быть не до конца крякнута или же там может быть зашито поведение на недачный кряк, етс.
Что значит не до конца крякнута? Типа меню File может работать нормально, а Edit — нет?
А может быть что угодно. На что только хватит фантазии разработчиков.
Например:
#define TRUE (rand() > 0.1? TRUE: FALSE) // happy debugging, crackers!!!
Ну и чтоб до кучи, Intel C++ Compiler 12.1.0:
1 тест — ничего
2 тест:
main.cpp(10): remark #1418: external function definition with no prior declaration
  int* prettyFormat(int i, char* buf)
       ^

3 тест: то же, что и второй, плюс
main.cpp(17): warning #592: variable "a" is used before its value is set
      return a;
             ^

4 тест — то же, что и третий.

К слову, Intel C++ Compiler является частью комплекса Intel Parallel Studio XE, linux-версия которого распространяется бесплатно для некоммерческого использования. Не триал. Professional-вариант. Для Linux. Не в пример некоторым компаниям.
По поводу последнего примера с многопоточностью — компилятор или анализатор надо указать каким-то способом, что код будет использоваться параллельно, иначе предупреждениями будет пестрить весь код. К тому же при подобного рода анализе надо учитывать, что сама фнкция может быть потоконебезопасна, но при этом бесопасно использована (локи могут стоять при ее вызовах, к примеру).
Согласен, особенно с «компилятор или анализатор надо указать каким-то способом, что код будет использоваться параллельно»
Я могу привести совершенно другие примеры кода, на которых анализатор отлично покажет себя. И, конечно, это ничего не будет означать. Об адекватном сравнении будет в конце. Сейчас некоторые комментарии к статье.

  1. Да, PVS-Studio не находит ошибки, наподобие связанной v.reserve. И ещё долго не будет находить. Это задача колоссальной сложности!!! Чтобы найти ошибку, надо практически виртуально выполнить часть программы, чтобы предположить, что память может быть не выделена. Да ещё вдобавок это шаблонный код. Поставили для спортсмена планку на высоту 3 метра, а потом «Фу… Не перепрыгнул...».
  2. Сообщения C4996 вовсе не находят ошибку, а просто ругаются на все sprintf и аналогичные функции. Совершенно непонятно, зачем упомянуты эти предупреждения.
  3. По поводу «C4700: uninitialized local variable 'a' used». Да, PVS-Studio не ругается. И в планах особенно нет. Зачем дублировать проверки компилятора?

По поводу гонок – меня статья расстроила. Следует вначале подумать, прежде чем приводить такие примеры. Анализатор теперь должен ругаться на все конструкции работы с глобальными контейнерами или просто переменными? Вдруг этот код начнет выполняться параллельно!

Откуда ему знать про параллельность?

А диагностика, кстати, есть. Мы поддерживаем OpenMP и иногда можем находить ошибки. Вот этот же код, но уже с потоками:

list<unsigned long> a_list;

unsigned long get_next()
{
	unsigned long ret = 0;
	if (!a_list.empty()) {
		ret = a_list.front();
		a_list.pop_front();
	}
	return ret;
}

unsigned long Foo()
{
  unsigned long S = 0;
  #pragma omp parallel for reduction(+:S)
  for (int i = 0; i < 10; i++)
    S += get_next();
  return S;
}

Диагностика PVS-Studio:

V1207 Data race risk. The 'a_list' object can be changed concurrently by a non-const function. GeneralPurposeErrors test.cpp 82

С обыкновенными потоками мы работать не умеем и не хотим. Это неблагодарная работа. Для этого есть инструменты динамического анализа. Или можно взять PC-Lint. Он это умеет. Только не надо фантазий, что он сам про потомки догадается. Для выявления параллельных ошибок код должен быть размечен специальным образом. Подробнее про это я писал в статье: “Что такое «Parallel Lint»?

За статью спасибо. Мы всегда рады замечаниям и пожеланиям и стараемся их реализовывать. Но мне не понравилась бессмысленность критики. Я не увидел здесь никакого сравнения.

Адекватное сравнение может быть только на реальных проектах. Взяли проект A. Проверили его с помощью PC-Lint / VisualC++ / PVS-Studio / C++Test. Внимательно проанализировали все сообщения. Составили табличку, какой анализатор сколько ошибок нашел. Вот единственное настоящее сравнение.

Беда в том, что это очень большой объем работы и даже мы не можем найти время этим позаниматься. Примером подобной статьи, может служить вот это “Проверка пяти открытых проектов статическими анализаторами общего назначения”.
Это тот случай, когда комментарий содержательнее и полезнее, чем статья.
Спасибо за все, реально, конечно же, критика здесь не имеет место. Мне «конкретно» интересно, какой анализатор, так сказать, лучше.
Код на C++ — это нечто, безошибочный код — это искусство. Мы все стремимся к совершенству, поэтому нам нужны анализаторы, пока не мере, нам кажется, что они нам нужны. И вот, увидев качественный продукт, нам нужны гарантии, чтобы использовать ее до конца своих дней!
Умеренная критика лучше всех помогает улучшить сам продукт. Системы защиты софта улучшились после «налета» крэкеров. Может статические анализаторы станут превосходными после «налета» человеческого анализа?
Вы сами себе противоречите. Ваш последний абзац в комментарии нисколько не оправдывает вашу статью. Как заметили выше, критиковать надо конструктивно, а такая как у вас критика анализатору не поможет.
Мне «конкретно» интересно, какой анализатор, так сказать, лучше.
Самый лучший анализатор — опыт. Да и вообще, эффективнее будет пользоваться несколькими анализаторами, а не заморачиваться кто лучше.
Если честно — ничего не понял. Может не будем начинать долгую коммента-дискуссию кто прав, а кто правее?
Вы не правы и написали в статье полную ерунду. Вы только доказали что ни разу не работали ни с VS, ни с PVS-Studio. VS ругается на все стандартные функции независимо от контекста и корректности, предлагая заменить их на проприетарные расширения от Microsoft чтобы обеспечить vendor lock-in вашего кода. Если бы вы написали хотя бы что-нибудь сложнее Hello world в VS или разобрались бы в сути сообщений, прежде чем выдавать это бессмысленное «сравнение» на Хабр, вы бы это знали и понимали, что пишете глупость.
Вот и началось долгая коммента-дискуссия! Я не написал предупреждения VS как сравнение, а в качестве информации, что именно выдала студия. Я не имел ввиду, что PVS должна была выдавать тоже, что и VS.
А на счет того, чтоб написать что-нибудь сложнее «Hello World» — а как вы догадались что я ничего сложнее не написал? Раньше никто не замечал)))

«Сомневаться в профессионализме оппонента — лютый враг профессионализма!» © я, только что.
> Я не написал предупреждения VS как сравнение, а в качестве информации, что именно выдала студия.
Если ваша статья — не сравнение, то что это? Просто разместили объяву информацию?

А это предложение из статьи ни что иное как сравнение:
> PVS-Studio опять молчит, а Visual Studio опять предупреждает о возможной проблеме при
использовании «небезопасной» функции, в данном случае — strncpy().

> А на счет того, чтоб написать что-нибудь сложнее «Hello World» — а как вы догадались что я ничего сложнее не написал?
Не передёргивайте. Я писал:
> Если бы вы написали хотя бы что-нибудь сложнее Hello world в VS
Вы впервые запустили VS и удивились потоку бесполезных предупреждений, приняв их за полезные.
> Вы впервые запустили VS и удивились потоку бесполезных предупреждений, приняв их за полезные.
Опять, как вы догадались? Молодцом!

Просто разместил объяву. Протест вроде «ваш пост плохой» ничего не говорит. И еще, просто скажите, что конкретно вас не устраивает? Если что надо поправить или улучшить — я готов!
Меня не устраивает то, что вы не провели анализ полученных результатов. Вы сделали как маркетолог: выдали результат в виде «у VS столько-кто предупреждений, а у PVS-Studio столько-то», а насколько корректными являются сами предупреждения, насколько некорректными являются сами примеры не написали.

Вы подталкиваете читателя к неправильным выводам. Вы констатируете:
> PVS-Studio опять молчит, а Visual Studio опять предупреждает о возможной проблеме при использовании «небезопасной» функции, в данном случае — strncpy().
Вы спрашиваете читателя:
> Вот здесь и мой вопрос: почему PVS-Studio ничего не выдает, у меня включены все три уровни «выдачи».
В этом есть подтекст, мол, если дефолтная VS сыпет варнингами, а дефолтный PVS-Studio нет, значит или PVS-Studio нужно долго настраивать чтобы что-то получить, или он вообще ничего не умеет?

Давайте я патч к GCC сделаю, который будет на каждый вызов любой функции выдавать сообщение «possibly unsafe function called %s». Это будет, по-вашему, идеальный анализатор?
Один из плюсов поставил я. Это так, в качестве инфы.

А настолько корректными являются примеры — они ведь все детально рассмотрены, особенно первые четыре (в предыдущем посте, ссылка есть в этом посте, в введении). Если есть что добавить — пожалуйста.

> Давайте я патч к GCC сделаю, который будет на каждый вызов любой функции выдавать сообщение «possibly unsafe function called %s». Это будет, по-вашему, идеальный анализатор?
Это уже ребячество, простите.
> А настолько корректными являются примеры — они ведь все детально рассмотрены

А ваш пятый — нет (это к вопросу о вашем профессионализме). И он является некорректным в контексте поставленной задачи: определение ошибок в параллельном коде. В нём нет достаточной информации чтобы определить, есть там ошибка или нет. Синхронизация доступа к общей переменной может происходить через примитив, объявленный в другой единице трансляции.

Корректность выданных сообщений также не рассмотрена.

> Это уже ребячество, простите.
Это ваш принцип сравнения анализаторов.
Пятый же классический пример переполнения буфера. С " В нём нет достаточной информации чтобы определить, есть там ошибка или нет. " согласен, но у меня такое мнение, что я вас не понимаю. Нет — это не сарказм. Если дело в оформлении поста или что-то еще… Не знаю, мне кажется вы просто пытаетесь доказать, что я написал «не нужный пост».
Очевидно, я неправильно посчитал листинги. Шестой пример у вас с параллелизмом (и вы это знаете).
Вы сказали что согласны и что не понимаете (я вообще не представляю как это возможно одновременно).
В общем, лучше потрачу свое время на более интересные вещи, чем на какого-то там завра, вы уж простите.

И еще, на всякий случай
О, переход на личности. Это о многом говорит.
Простите, если обидел, просто не вижу смысла продолжать. Если хотите даже могу удалить пост.
Оставьте. Нормальная статья, нормальная дискуссия. Просто Вы на Хабре недавно и ещё не привыкли. У меня, например, и ещё более агрессивные переписки были. :)

Лучше давайте вместе попробуем ваш проект проанализировать и написать об этом.
Ладно, спасибо. Я намерен проводить анализ в течение двух недель и если возникнут вопросы, как я уже понял, охотно свяжусь с вами.
Расскажу о своём опыте тестирования PVS-Studio. Скачал, поставил, взял проект на 500к строк кода, запустил. Нашло пару сот ворнингов. Беру первый — ложное срабатываение, второй-тоже. В общем, после где-то 30-го ложного срабатывания, так и не найдя ни одного реального бага я плюнул и удалил PVS. Не знаю, может быть случайность, но что было, то было.
Мы стараемся сделать инструмент максимально простым интерфейсно. Но все-таки это не тетрис и требует определенного погружения. Предлагаю вновь поставить PVS-Studio и пообщаться с нами в поддержке. Нам важно, чтобы первое впечатление было положительным, и мы попробуем учесть, чтобы не было желания сразу удалить. Мы будем очень признательны, если Вы уделите нам время.

Для начала можно попробовать отключить 64-битные диагностики (кнопка 64). Во вторых, если навязчиво повторяется одна и та же ошибка, то можно подумать как её исключить. Для этого ест множество механизмов. Напишите нам. Можно и здесь пообсуждать.
По существу статьи коллега уже высказался. Отмечу лишь, что с сравнивать инструменты нужно более комплексно. Например, если разработчики в субботу обеспечивают поддержку — то это, наверное, дополнительный плюс в копилку?
Sign up to leave a comment.

Articles