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

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

Эх, а тот самый двойной if не заметили. Ну или не стали публиковать.

Однозначно спасибо!

Лет 7 назад, в одном проекте проекте видел switch на 17 тысяч строк. С вложенными ветвлениями. Увы, проект очень древний и открытыми исходниками там и не пахло, даже скриншота не осталось.

Вспоминается код одной CRM, где инициализация подчинённых окон проходила с помощью if (название окна = окно1) then initWindow1() else… и так около 100 окон.
Пользователи жаловались на пару минут загрузки при переходах.
Эм… а разве 100 if-ов, не будут обработаны почти мгновенно?
Будут. но тут немного не то: init вызывается для каждого окна и для каждого проходит по всем if в поисках нужного, поэтому — для первого — 1 if, для второго — 2, для сотого — 100 if, которые вызываются по очереди и немного инвалидируют кэш.
Во времена Pentium D это было дорого и печально.
НЛО прилетело и опубликовало эту надпись здесь
Как минимум, это очень неприятно читать и править.
И так логика описана для всех… надцати главных окон.
НЛО прилетело и опубликовало эту надпись здесь
Если дёргать WinAPI функции, чтобы для окон извлекать заголовки, да ещё написать так, что сложность квадратичная — это миллионы отнюдь не быстрых вызовов.
Аххахахах, вот это действительно сильно написано :D
НЛО прилетело и опубликовало эту надпись здесь
Что-то я «Предупреждение 4» (V805) не понял.

Зачем функции, возвращающей число символов _до_ завершающего нуля «пробегать все символы строки»? Увидит первый «0» и остановится. Тут максимум «оптимизация» вызова функции вместо сравнения ИМХО…

Имеется в виду, что если строка не пустая и достаточно длинная, strlen пробежится по ней всей, хотя могла бы остановиться после первого шага.

Так о том и речь, что не бегает она по всей строке — при первом вхождении нуля вываливается. Что в BSD, что в glibc — stackoverflow.com/a/1733294/2320413

А… кажись дошло — если строка не пустая, то получаем лишний цикл вычисления длины… :)
Собс-но, фраза «Если на вход подается большая строка, то каждый её символ всё равно будет сравнён со строковым нулём.» ввела в заблуждение
Если строка непустая, strlen всю её пробегает. Хотя для проверки, что строка непустая, достаточно было посмотреть на первый символ.
Не пробегает там strlen ничего. Можете убедиться.

А читателю понятнее.

P.S. Специально взял компиляторы подревнее, чтобы не было сомнений в том, что это новомодная оптимизация.
У меня MSVC (наверное, как и у разработчиков и клиентов PVS-Studio основной компилятор), и там всё честно пробегает :P

И VVVVV с большой вероятностью собран MSVC.
VVVVVV's official desktop versions are built with the following environments:
Windows: Visual Studio 2010

Я может быть неправильно вас понял, но у меня сложилось впечатление, что у вас "символы до завершающего нуля" и "вся строка" это разные вещи. Нет, это одно и то же. И там нет никакого "первого вхождения нуля" и вообще никаких вхождений нуля. Ноль это спецзначение, обозначающее конец строки, и никаких других концов, до которых можно пробежать, у строки быть не может.
Соответственно, strlen пробегает все символы строки + не-символ-строки '\0' который идёт ПОСЛЕ всех символов строки, а затем останавливается. Байты после нуля уже к строке никакого отношения не имеют, даже если под них выделена память в массиве char, в котором эта строка хранится.

Напомнило. Первый раз, когда я писал процедуру сортировки для 4 элементов, я использовал тоьлко if'ы, и код получился аж на 150 строк. Меня извиняет только то, что в тот момент мне было только 9 лет.

Я тоже лет в 11 изобрел сортировку, много позже я узнал что у нее даже есть имя — сортировка пузырьком :)

Terry Cavanagh прямо написал, что там bullshit на bullshit-е.
Не каждый программист (даже в замкнутой компании, среди коллег) осмелится показать всему миру (или своим коллегам) свой текущий код. Не тот, что для этого тщательно вылизан и причёсан. А тупо "прямо щазз", "в честь юбилея". (но при этом таки работает!)

НЛО прилетело и опубликовало эту надпись здесь
А зачем?
НЛО прилетело и опубликовало эту надпись здесь
А что сейчас мешает открытому проекту использовать анализатор PVS-Studio? Просто пример: берём и используем.
В этом списке явно не хватает PVS-Studio!
image
Codacy вообще бесполезен (самый кривой в этом списке).
У Coverity очень ужасный WEB-интерфейс.
LGTM игнорит windows проекты.
Кстати, Coverity заинтегрировался с Travis-CI. Было бы здорово, что бы PVS-Studio заинтегрировался с AppVeyor (что бы свою сборочную систему не городить).
Да даже и без интеграции с AppVeyor можно обойтись.
Как юзать CoverityScan совместно с AppVeyor
К примеру, на сервере AppVeyor уже лежит дистр CoverityScan, который нужно перед сборкой скачать. После выполнения cov-build результаты кладуться в архив и через WEB-форму заливаются на сервер Coverity. Там результаты прогоняются через cov-analyzer и на персональной страничке проекта появляются результаты (эта страничка ужасна).
Это всего лишь картинки, которые можно сгенерировать.

На главной странице документации приведены способы интеграции своего проекта с разными CI:

Некомерческим открытым проектам можно использовать PVS-Studio бесплатно. Где-то в блоге у нас есть полное описание условий.
НЛО прилетело и опубликовало эту надпись здесь
Например, здесь shields.io. Там есть кнопка Your Badge. Это один из многих проектов для генерации бейджей.
НЛО прилетело и опубликовало эту надпись здесь
Хм. Странно, что вы только про генерацию бэйджика ответили.
А вот как удобный и понятный WEB-интерфейс с результатами сгенерировать? Вот в чём вопрос.
У Coverity очень ужасный WEB-интерфейс.
По отзывам у них много проблем, в том числе с анализом.

PVS-Studio используют в связке с SonarQube. Мы очень давно сделали плагин для него. Это очень популярное и удобное решение среди клиентов наших клиентов.
Перекрытие имён – это достаточно грубая ошибка, которую бывает весьма тяжело отыскать самостоятельно в ходе обзора кода.

Увы, обычно это ошибкой не считают. А так, всегда всё компилю с -Wshadow -Werror и такие места сразу отсеиваются.

Еще можно Resharper юзать, там показывает ошибку во время написания кода.

Насколько я знаю, ReSharper только для .NET, в статье речь про С++ :)
Для плюсов же очень круто работает clang и магия от той же JetBrains, в паре они ругаются на всё от неверно передаваемых значений (по их мнению) до названия переменных и кодстайла.

ReSharper уже давно и для C++ есть. Не помню точно с какой версии, но 5 лет назад он уже точно C++ поддерживал.

Интересно попробовать, спасибо :)

Если вы читаете этот текст – значит, вы либо подумали, что с заголовком статьи что-то не то, либо увидели в нём название знакомой компьютерной игры.
… либо подумали, что статья про «домен с WWW vs домен без WWW» и решили посмотреть, каковы нынче тренды…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий