Pull to refresh

Comments 23

UFO just landed and posted this here
Видимо, был выбран Windows для сборки и анализа проекта. Под эту платформу CMake не умеет генерить compile_commands.json. С другой стороны, из CMakeLists можно сделать проект для Visual Studio, но это уже вопрос к автору.

В любом случае, это уже дело вкуса, т.к. сейчас анализатор поддерживает почти всё. Я, например, предпочитаю сборочные системы для Linux, чтобы проверять проекты в Docker.
Всегда хотелось написать статью в стиле «Хьюстон, у нас проблема» :D. Посмотрим, что за проект.
Любопытно будет посмотреть.
Может, в стиле «Хьюстон, у ВАС проблема»? ;)
Дело в том, что все ветви if...else имеют return

Это на основании того что анализируемое значение enum? Частенько использую что то вроде enum class SomeId { null = 0 }. Ну и проверки вроде if(id == SomeId::null) return; Всё за такой проверкой будет считаться unreachable?

На основании того, что там просто return. Неважно, что в условии, если в итоге выполняется return или return.

Что касается содержимого условий (enum, не enum, неважно), есть другой тип недостижимого кода, который находит эта диагностика. После того, как Dataflow-анализ определяет Always True/False ветви, выполняется дополнительный поиск недостижимого кода уже с учётом этой информации.

Но там же if/elsif/elsif. Ветки else нет. Судить о недостижимом можно только по тому что в этих ветках проверены все значения enum.

А если enum вышел из диапазона возможных значений, то это уже UB. :)
Это уже другая сущность. Я про классический enum. :)
И в классическом enum всё то же самое — за исключением того, что мы заранее не знаем какой тип будет выбран компилятором.
На самом деле даже этого нету. Для обычного enum-а можно указать базовый тип, если ну указать — тогда компилятор выбирает, да, но обычно это int. Надо в стандарте посмотреть, всегда ли это должен быть int.
Для обычного enum-а можно указать базовый тип
Начиная с C++11 только.

Надо в стандарте посмотреть, всегда ли это должен быть int.
Нет. Может быть любой тип куда влазят все перечисленные значения. Хотя на некоторых платформах int — минимум.
Вообще-то это две разные вещи.

C++0x — это рабочее название для C++11, когда он был в разработке.

А в C++03 enum-specifier — enum identifieropt { enumerator-listopt }, извините. Это ISO/IEC 14882:2003…
Не совсем так. Неопределённое поведение — это когда вы выходите за границы выбранного компилятором типа. Положить в enum { hi = 2, ho = 4 } hiho; троечку не запрещено.

В примере с рефакторингом через switch последние две строки просто переходят в default ветку. И перестают считаться unreachable.

А есть разбор pvs-studio? Что плохого pvs-studio нашел в коде самого pvs-studio?

> Легко понять, что умножение 12 на 1 бессмысленно, а скобки вокруг 2 * order не нужны. 

Легко заметить что x << n = x * (2^(n+1)). И (x * 1) << n эквивалентно x * (1 << n). А вот вторые скобки обязательны. Чтобы не вспоминать про приоритеты.
часть ошибок должен подсвечивать компилятор:
static const SphericalCap cap3(0,0,-1); // unused variable
...
QVector<double> xs, ys; // unused variable
...
updatePos = true; // invariant
...
setFlagAtmosphere(pl->hasAtmosphere() 
                    & conf->value("landscape/flag_atmosphere", true).toBool()); // operator & on bool

Вероятно, часть диагностик компиляторов по историческим причинам выключались, и в итоге выросли ошибки, для поимки которых (казалось бы) никакой PVS не нужен
Sign up to leave a comment.