Comments 99
Для создания сообщения об ошибке, происходит вызов функции: cond_col->getName(). Этого делать нельзя, так как указатель cond_col будет нулевым.
Он возможно будет нулевым, но не всегда из-за наличия второго условия. Думаю там просто стоит добавить дополнительную проверку перед выбросом исключения.
А если getName — static функция?
class IColumn : private boost::noncopyable
{
....
/// Name of a Column. It is used in info messages.
virtual std::string getName() const = 0;
....
};
template <typename T>
class ColumnVector final : public IColumn
{
....
std::string getName() const override;
....
};
using ColumnUInt8 = ColumnVector<UInt8>;
по моему если код компилируется то getName явно не статичен
#include <iostream>
#include <string>
class Lol
{
public:
static std::string name() { return "lol"; }
};
int main()
{
Lol *ptr = nullptr;
std::cout << ptr->name() << std::endl;
return 0;
}
$ g++ -std=c++17 ./testLol.cpp && echo $?
0
$ ./a.out
lol
я не обладаю плюсами, но разве компилятор не выдаст ошибку компиляции при попытке получить статический метод от экземпляра класса, а не от самого класса?Не выдаст и, что удивительно, экземпляр класса по-прежнему должен существовать для того, чтобы программа гарантированно работала (хотя на конкретных компиляторах и статические и нестатические фенкции могут отрабатывать при вызове для
nullptr
).С другой стороны, видно, что этот код корректен и просто написан с «запасом надёжности».
Как раз наоборот: этот код так и манит, добавляя/удаляя очередную версию формата, исправить одну из проверок, и забыть исправить вторую.
switch
лучше не только тем, что «затыкает» предупреждение, но и «запасом надёжности» в свете будущих изменений кода.Кажется, в ваших обзорах ещё не попадалась диагностика V789. Редкий вид (с) :)
Все эти анализаторы кроме пользы добавляют гемор в виде замедления билда, ложных срабатываний, информационного шума и ложного чувства безопасности. Для себя я решил что профессионалам чем меньше таких тулзов тем лучше — гемор легко перевешивает пользу. А нубасам такое тоже особо не поможет — им бы учиться писать юнит тесты, а не тратить время на затыкание варнингов. Возможно, в Яндексе думают так же.
Хотя если тесты гонять перед релизом, то гемор будет меньше, и можно будет выцедить нормальное соотношение время/ошибки, так что хз.
Дисклеймер: пвс я не пробовал.
P.S. Смайлик ставить не буду, так как я совершенно серьезен. И даже напишу на тему этого комментария маленькую статью-ответ.
Так что вам нужно влезть в нишу между встроенным в clang/gcc/msvc анализатором (бесплатно и всегда в наличии) и *SAN'ом (сложно и дорого, но зато ложных срабатываний — почти нуль, любую ошибку можно сразу в багтрекер заносить). Так ли велика эта ниша?
И собственно непонятно, прочему речь идёт про «нишу между». clang/gcc/msvc это своего рода статические анализаторы. С этим все просто. Они работают вот так. Мы лучше. С динамическими анализаторами всё тоже просто. Здесь нет конкуренции, а есть взаимное дополнение. В чем-то лучше динамические анализаторы, в чем-то статические. Пример: находим ошибки в Valgrind.
С этим все просто.С этим всё совершенно непросто.
Они работают вот так. Мы лучше.Ну если бы вы работали хуже, то в вас бы вообще смысла не было. Но тут важно заметить что анализ с помощью clang/gcc/msvc у вас уже есть — всегда, по умолчанию. А вот всё остальное — нужно устанавливать/настраивать отдельно. А если у вас в проекте контрибуторы из кучи других компаний? Сказать им «включите -Wall -Werror» — это одно, а отлавливать ошибки с помощью PVS-Studio (который они и запустить-то не могут!) — совсем другое.
С динамическими анализаторами всё тоже просто. Здесь нет конкуренции, а есть взаимное дополнение.Это всё «халва». От неё слаще во рту не становится, опять-таки.
Как я уже сказал — если динамический анализатор чего-то нашёл, то «отмазаться» не получится: «на спор» я могу сдеать код, в котором не будет ошибки, но который будет вопить на анализаторе — но на практике я такого ни разу не видел.
А у статического анализатора (любого) есть ложные срабатывания. А если ты ещё и локально код проверить не можешь… В общем — так ли велик выигрыш?
Пример: находим ошибки в Valgrind.Странный пример. Valgrind под Valgrind'ом запустить нельзя, так что понятно, что в нём самом могут остаться ошибки, которые PVS-Studio может найти. Но это не такому большому количеству народу нужно…
Даже со всеми санитайзерами не всегда понятно как воспроизвоидится некий гейзенбаг. Статический анализатор позволяет перебдеть и, таки, не допустить ситуации, которая спровоцирует баг.
Статический анализ — это ответ на вопрос «Что ЕЩЕ я могу сделать для того, чтобы улучшить качество кода?». Если компания зарабатывает с помощью своего программного кода, то она стремиться всеми силами улучшить его качество. Качество — это расширяемость, масштабируемость, простота поддержки и др. Так вот, «что ЕЩЕ я могу сделать, чтобы улучшить качество кода?». Внедрить статический анализ! Не надо думать, что это ВМЕСТО чего-то. Вместо тестов, вместо код ревью, вместо динамических анализаторов… Это «что ЕЩЕ».
«А вот в компании XXX нах… не сдался ваш PVS-Studio!» И такое бывает конечно. Далеко не все компании, который пишут программный код, зарабатывают на нем деньги. Например, российская оборонка программный код пишет, но деньги они зарабатывают не на нем. Поэтому в оборонных предприятиях России PVS-Studio не используют.
А компания Epic Games зарабатывает на своем коде — движке Unreal Engine. Поэтому когда встал вопрос «Что ЕЩЕ мы можем сделать, чтобы код Unreal Engine стал качественнее?», они внедрили PVS-Studio.
Не надо думать, что это ВМЕСТО чего-то. Вместо тестов, вместо код ревью, вместо динамических анализаторов… Это «что ЕЩЕ».Так не бывает. Если код вы не пишите для участия в каком-либо конкурсе, где качество — критерий успеха, то вы всегда должны выбирать между улучшением качества кода и чем-то ещё. Можно написать ещё пару тестов, а можно — новую фичу дополнить… что выбрать?
Если компания зарабатывает с помощью своего программного кода, то она стремиться всеми силами улучшить его качество.Вот только «количество ошибок» — далеко не единственный критерий. Могут быть много других. И уменьшения количества ошибок можно достигать разными средствами — можно вложиться в статический анализатор, а можно — в рефакторинг или более подробный style guide. Что принесёт большую отдачу? Результат — сходу не очевиден, вот совсем не очевиден.
Поэтому когда встал вопрос «Что ЕЩЕ мы можем сделать, чтобы код Unreal Engine стал качественнее?», они внедрили PVS-Studio.А могли бы вместо этого вложиться в фаззинг — но предпочли PVS-Studio. Вопрос — почему и почему Google поступил иначе?
Так не бывает.
То есть вы ЛИБО пишите тесты, ЛИБО делаете код ревью? И сразу же увольняете того разработчика, который просит сделать код ревью для его тестов? Ведь он тратит время!
Вопрос — почему и почему Google поступил иначе?
Google сам разрабатывает статический анализ. В clang. Мы знаем людей, которые делают это.
Можно написать ещё пару тестов, а можно — новую фичу дополнить… что выбрать?
То есть вы ЛИБО пишите тесты, ЛИБО делаете код ревью?
Вы намеренно делаете ложный вывод, доводя до абсурда аргумент khim, или просто некому проревьюить ваш комментарий перед публикацией?
То есть вы ЛИБО пишите тесты, ЛИБО делаете код ревью?Представьте себе. Я не умею одновременно делать и то и другое.
То что я пишу и тесты и делаю код ревью (но в разное время) просто обозначает что и то и другое посчитали достаточно ценной деятельностью — и потому оставили. Если бы выяснилось что написание тестов в 100 раз эффективнее код ревью (или наоборот) — от одной из этих двух вещей отказались бы.
Google сам разрабатывает статический анализ. В clang. Мы знаем людей, которые делают это.А это-то вообще тут причём? Да, разрабытывает — потому что автоматический, всегда присутствующий, встроенный в компилятор статический анализ — это хорошо. А вот хорошо ли иметь ещё и отдельных анализатор — это большой вопрос.
Можно написать ещё пару тестов, а можно — новую фичу дополнить… что выбрать?
По сути статанализатор это некая замена (условно, конечно) тем самым паре тестов сверху.
А могли бы вместо этого вложиться в фаззинг — но предпочли PVS-Studio. Вопрос — почему и почему Google поступил иначе?Я думаю, это очевидно.
У Гугла приоритет — сетевые сервисы, там ошибка, приводящая к DoS или RCE это очень серьёзно.
Для UE такие ошибки некритичные (если падает при загрузке какой-то кривой модельки, никто и не заметит, потому что модельки загружают туда прямые).
Главное в UE — чтобы графика правильно рисовалась и физика моделировалась. Тут фаззинг бессилен. Ну скормишь рандомные данные в движок, получишь какой-то результат. А как проверить, что результат верный?
Описывал свою ежедневную боль. В нашей компании принято что гит хуки запускают поверки, и понеслась. Ни одной ошибки у меня за год не нашли, а каждый пуш какие-то проблемы. При том открываю приложение, и за пять минут которые тратится на поверки, могу с лету найти три бага — в большой компании баги добавляются с невероятной скоростью.
В общем, пользуйтесь, рад что повеселил, хоть смайлик и не поставили. :D
Бывает ещё хуже: как-то исправление настоящей ошибки по нашему отчёту привело к завалу сотни тестов в одном проекте. Отличные тесты были, не правда ли?
Не думаю что проблема в цене лицензии, Яндекс точно может себе её позволить.
Ну-ну, написал я им, внедрил в линукс билды по триальному ключу, интегрировал, написал маны для соратников. А когда дошёл разговор до платных лицензий, они &₽?!@"&!/₽-&!₽ Ой, чуть NDA не сдержал.
Говорить о цене стоило до всего остального. Ибо вполне может оказаться, что у них, например, в билд-ферме 10000 машин — и что, для каждой лицензию покупать?
Триальная лицензия — это уж точно не для интеграции и для написания манов для сотрудников…
&₽?!@"&!/₽-&!₽
Не смог расшифровать. Мы что-то сделали не так? Как мы можем это исправить?
Сделайте исключение сорцов per project, а не глобально, с поддержкой раскрытия переменных окружения из VS-проектов для формирования полных путей вместо масок.
Я не уверен, что я могу обсуждать денежные вопросы прилюдно без вашего разрешения. Если позволите, я объясню, что вы делаете не так, и откуда берутся "&₽?!@"&!/₽-&!₽".
Знаете, я писал длинное письмо, но потом передумал. Кратко: не предлагайте отделу 20 лицензий, если отдел запрашивает 8. Отделу и 1 на билд сервер хватило бы, но отдел попросил честные 8, т.к. в команде 7 плюсовиков. Нельзя быть таким жадным, Евгений.
Да смысла нет.
Ребята из Я, я вам написал маны по настройке Coverity, извините, но ссылок дать не могу, так как не в компании. Реально хорошо находит баги, умеет делать рассылки и прочие кошерные вещи. И проблем с закупкой нет :)
Жесть какая, маны он написал… Вот подробнейшая документация по PVS-Studio, и не надо никакие левые маны брать.
нии Yandex, интересуется лицензированием PVS-Studio, качает триал и пропадает.
Видимо у них в плане работ стоит проверка анализатором каждые полгода.
Разработчикам PVS-Studio: очень понимаю сотрудников Yandex — с ценовой политикой на продление лицензий вида "а давайте увеличим стоимость продления лицензии PVS-Studio на рандомную существенную величину" уже не первый год подряд и как результат проблематичностью бюджетирования, также начинаем поглядывать на альтернативы.
Нет никакой возможности продавать по цене пятиледней давности.
Однако если вы не просто так в комментах пообсуждать, а по делу, то напишите мне и я расскажу о способах справиться с указанной бедой.
Но я так, просто в комментах пообсуждать. Хоть я бы и очень хотел купить ваш продукт себе и на своей работе — возможности такой нет. Для собственного использования слишком жирно, а на работе сейчас тоже бюджета нет.
Так что я вас без коммерческого потенциала отвлекаю.
А почему бы цену продления не делать фиксированной в момент покупки?
Но я так, просто в комментах пообсуждать.
Извините, Хабр — технический ресурс и если мы будем обсуждать нюансы бизнеса, то это будет не интересно аудитории.
Извините, Хабр — технический ресурс и если мы будем обсуждать нюансы бизнеса, то это будет не интересно аудитории.
Друг мой, аудитория годами читает Milfgard'a и нюансы бизнеса МосИгры (это как яркий пример, есть еще вернувшийся Мегамозг).
Возвращаясь же к топ-комментарию:
Конечно менялась! У нас появился C# анализатор, у нас появился C++ анализатор под Linux, поддержка SonarQube, интеграция с CI и многое другое. Сотни диагностик, сотни страниц документации.
Эта фраза может произвести двоякое впечатление. Можно возразить что-то вроде "с чего мне платить за SonarQube и С++ анализаторы под Linux? У меня .NET проекты!!!111".
Но, попытка это прикрыть интересами сообщества выглядит толстым таким лицемерием и воспринимается крайне негативно.
У нас появился C# анализатор, у нас появился C++ анализатор под Linux, поддержка SonarQube, интеграция с CI и многое другое.
«С этого года во всех наших автомобилях установлены крылья и ракетные двигатели, при приезде на ТО мы в обязательном порядке их ставим и вы обязаны за них заплатить даже если они вам не нужны».
Примерно так это звучит. Зачем компании, которая пишет на плюсах под винду версия под Linux и C# анализатор? Сделайте это отдельной лицензируемой функциональностью, кому надо — тот купит.
P.S. Обновляемый список статей, в которых мы рассказываем об ошибках, найденных с помощью PVS-Studio в открытых проектах.
P.P.S. Предлагать проекты на провреку лучше всего здесь.
Что-то вроде этого:
std::vector<int> a = ...;
...
auto b = std::move(a);
...
auto s = a.size(); // ???
Главное, семантика перемещения. Объект а после перемещения хранит непонятно что (если move реализован через swap, то в а лежит содержимое b), и вроде нет никаких причин работать с а, кроме как присвоить ему новое значение.
Мне кажется это главным изъяном операции перемещения введеной в С++11 — появление объектов с непонятным состоянием, которые по идее должны закончить свою область видимости после перемещения.
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод
«Перевод» очень похож на немного изменённый результат google translate.
Учитывая, что англоязычный сегмент рынка больше русскоязычного, такой подход выглядит странно.
Выучить английский; нанять того, кто знает английский. Масса вариантов.
github.com/yandex/ClickHouse/pull/1204
(Одной из ошибок уже не было в master, так как анализировалась более старая версия кода.)
Анализатор отличная вещь, однако, он не заменит голову программиста, и, прежде чем начинать им пользоваться, хорошо бы писать код так, чтобы компилятор не выдавал стандартных ворнингов (а где вы видели это в больших проектах?).
Банальные вещи: переопределение в наследнике унаследованного невиртуального метода (нарушение полиформизма, и различное поведение, в зависимости от того, к какому типу объектив приведен в статике), смешение знаковых и беззнаковых целых, включая случай еще и разного размера (при желании можно все решить в статике, чтобы не было неожидаемого поведения), тысячи их.
Штука в том, что профессия разработчика/программиста была, есть и будет инженерной, где требуется квалификация и здравый смысл.
А ее всячески пытаются запихнуть в ремесленничество с помощью как организационных, так и технических средств.
Все это нужные вещи, конечно, но делаются не в той последовательности.
хорошо бы писать код так, чтобы компилятор не выдавал стандартных ворнингов (а где вы видели это в больших проектах?).
Большие проекты — это сколько по-вашему?
Штука в том, что профессия разработчика/программиста была, есть и будет инженерной, где требуется квалификация и здравый смысл.
А ее всячески пытаются запихнуть в ремесленничество с помощью как организационных, так и технических средств.
Точно так же как и автоматическая коробка передач на атомобиле, стиральна машина-автомат и тому подобное. Низводят людишек до сосотояния операторов.
Читаем:
Другие преимущества статического анализа кода:
…
2. Статический анализ не зависит от используемого компилятора и среды, в которой будет выполняться скомпилированная программа. Это позволяет находить скрытые ошибки, которые могут проявить себя только через несколько лет. Например, это ошибки неопределенного поведения. Такие ошибки могут проявить себя при смене версии компилятора или при ...
Быстрый старт в Windows и Linux
…
Отметим только, что в PVS-Studio для Windows и Linux предусмотрены специальные утилиты, собирающие информацию о запусках компилятора. Эти инструменты позволяют быстро выполнить анализ проекта, собираемого любым способом. Вы можете быстро познакомиться с возможностями анализатора, не тратя время на его интеграцию с makefile или сборочным скриптом. См. описание утилиты Standalone (Windows) и pvs-studio-analyzer (Linux).
Это тоже опрометчивая претензия?
- Появилась поддержка ARM Compiler 5 и ARM Compiler 6 в составе среды Keil uVision 5.
- Компиляторов ARM Compiler 5 и ARM Compiler 6 в составе среды Keil DS-MDK.
- Мы поддерживаем IAR C/C++ Compiler for ARM в составе среды IAR Embedded Workbench.
Передаю привет разработчикам компании Yandex