• Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander
    0
    Написал заметку в которой развиваю мысль о вреде макросов: Вред макросов для C++ кода.
  • Вред макросов для C++ кода
    0
    Его без нас проверяют и правят :).
  • Топ 10 ошибок в C++ проектах за 2018 год
    0
    А вот и на русском: Вред макросов для C++ кода.
  • Топ 10 ошибок в C++ проектах за 2018 год
    +3
    Это всё от злоупотреблений макросами :). Пример прям в тему. Как раз сегодня гостевой пост "Macro Evil in C++ Code" на эту тему опубликовал. Скоро на русском на Хабр его выложу.
  • Проверка FreeRDP с помощью анализатора PVS-Studio
    +3
    Будут и статьи и под Java. Сил на всё не хватает. Идёт цикл подготовки к весенним конференциям.
  • Полнофункциональный RDP клиент — FreeRDP
    0
  • Как сделать так, чтобы вашу англоязычную статью для Хабра прочитали десятки тысяч человек: 3 простых совета
    +1
    Кстати, а у нас есть и практики. Может начать доклады на тему продвижения делать… :)
  • Подсчитаем баги в калькуляторе Windows
    +2
    Да, это может быть не ошибкой. Но ошибки тяготеют к такому коду. :)
  • Подсчитаем баги в калькуляторе Windows
    0
    Да, V550 (An odd precise comparison) весьма шумная диагностика. Поэтому она относится к уровню Low, который отключен по умолчанию. Однако, это одним она не интересна, а другим бывает ой как даже нужна и полезна. Цитата из статьи "О том, как мы опробовали статический анализ на своем проекте учебного симулятора рентгенэндоваскулярной хирургии":

    V550 An odd precise comparison: t != 0. It's probably better to use a comparison with defined precision: fabs(A — B) > Epsilon. objectextractpart.cpp 3401

    D3DXVECTOR3 N = VectorMultiplication(
                      VectorMultiplication(V-VP, VN), VN);
    float t = Qsqrt(Scalar(N, N));
    if (t!=0)
    {
      N/=t;
      V = V - N * DistPointToSurface(V, VP, N);
    }
    
    Подобные ошибки повторяются достаточно часто в данной библиотеке. Не скажу, что это стало для меня неожиданностью. Уже ранее наталкивался на некорректную работу с числами с плавающей точкой в этом проекте. Однако систематически проверять исходники на этот счет не было ресурсов. По результатам проверки стало ясно, что нужно дать разработчику почитать что-то для расширения кругозора в части работы с числами с плавающей точкой. Скинул ему ссылки на пару хороших статей. Посмотрим на результат. Сложно однозначно сказать, вызывает ли эта ошибка реальные сбои в работе программы. Текущее решение выставляет ряд требований к исходной полигональной сетке артерий, по которым моделируется растекание рентгеноконтрастного вещества. Если требования не выполнены, то возможны падения программы или явно некорректная работа. Часть из этих требований получена аналитически, а часть эмпирически. Не исключено, что эта вторая часть требований растет как раз из некорректной работы с числами с плавающей точкой. Нужно отметить, что не все найденные случаи употребления точного сравнения чисел с плавающей точкой являлись ошибкой.

    P.S. При желании уровень отдельных предупреждений в PVS-Studio можно изменить. Т.е. можно сделать V550 уровнем High.
  • Подсчитаем баги в калькуляторе Windows
    0
    Ограничение переходов (кликов) относилось к демо-версии. Видимо она и была у Вас установлена. А в бесплатных версиях никакого ограничения на клики не было и нет.
  • Бесплатный PVS-Studio для тех, кто развивает открытые проекты
    0
    Подытожил в одной статье все варианты бесплатного использования PVS-Studio, которые мы предоставляем на данный момент. Плюс не стоит забывать, что для того, чтобы попробовать PVS-Studio, всегда можно просто скачать дистрибутив и запросить триальный ключ.

    Статья: "Бесплатные варианты лицензирования PVS-Studio".
  • Как использовать PVS-Studio бесплатно
    0
    Подытожил в одной статье все варианты бесплатного использования PVS-Studio, которые мы предоставляем на данный момент. Плюс не стоит забывать, что для того, чтобы попробовать PVS-Studio, всегда можно просто скачать дистрибутив и запросить триальный ключ.

    Статья: "Бесплатные варианты лицензирования PVS-Studio".
  • Подсчитаем баги в калькуляторе Windows
    +1
    По количеству просмотров и комментариев чувствуется, что калькуляторы волнуют людей :). И автор этой статьи уже пишет заметку про калькулятор Qalculate! и делает facepalm-ы. Причина скоро станет понятна. Если совсем кратко: там всё хуже, чем в калькуляторе от Microsoft.

    Но я вот к чему. Не обязательно ждать, когда мы проверим тот или иной проект. Есть различные варианты бесплатного использования PVS-Studio. Плюс можно триальную версию использовать. Можно и что-то проверить и статью написать. Или ошибки в любом проекте поправить. Подробнее: Бесплатные варианты лицензирования PVS-Studio.
  • Подсчитаем баги в калькуляторе Windows
    +1
    В статьях мы тщательно подходим к выписыванию фрагментов кода, делая их по возможности самодостаточными для демонстрации ошибки. С самого начала в статье приводился следующий фрагмент кода:
    wchar_t m_resolvedName[LOCALE_NAME_MAX_LENGTH];
    
    Platform::String^ GetEnglishValueFromLocalizedDigits(....) const
    {
      if (m_resolvedName == L"en-US")
      {
        return ref new Platform::String(localizedString.c_str());
      }
      ....
    }

    Из этого пример можно видеть, что такое m_resolvedName. Мы поспешили и не проговорили как следует это текстом и скомкано описали ошибку. Это признаём. Но не надо свою собственную невнимательность превращать в:
    В первоначальной редакции статьи никакого указания, что передаётся массив, не было. Поменяли, теперь стало иначе.


    P.S. Эффект, возникающий из-за пула строк, кратко затронут в документации (семилетней давности) на диагностику V547. Только не говорите, что и ссылки на документацию тоже не было :).
  • Подсчитаем баги в калькуляторе Windows
    +1
    В сообщении сложно уместить описание проблемы. Однако, этот вопрос рассматривается в документации к диагностике V547. А в статье просто не аккуратно написано, потому что очень торопились. Перед переводом подретушируем. Не хватает вокруг этого случая ещё и дискуссии на англоязычных форумах устраивать… :)
  • Подсчитаем баги в калькуляторе Windows
    +2
    Вы осознаёте, что
    const wchar_t *A = L"test";
    wchar_t B[] = L"test";
    
    принципиально разные сущности в C++?
  • Подсчитаем баги в калькуляторе Windows
    +8
    Из контекста в коде калькулятора непонятно, массив там передаётся или ссылка на текстовую константу.

    Ох… Ну сколько можно… В статье чётко написано:
    wchar_t m_resolvedName[LOCALE_NAME_MAX_LENGTH];
    ...
    if (m_resolvedName == L"en-US")
    

    Такое условие всегда false.

    Для кода:
    wchar_t * buffer = L"test";
    if (buffer == L"test")

    Условие может сработать. Но это совсем другой случай. Сравнение может дать true, но это зависит от везения и фазы луны.

    P.S. Условие if (m_resolvedName == L«en-US») сработало из-за того, что код уже успели поправить, заменив простой массив символов на std::wstring. Уже несколько раз это обсудили в комментариях.

  • Подсчитаем баги в калькуляторе Windows
    +3
    Это C++/CLI.
  • Подсчитаем баги в калькуляторе Windows
    +1
    Это навреное была моя статья "Большой брат помогает тебе".
    В данном случае никакого UB нет. Один указатель на wchar_t сравнивается с другим указателем. Вот и всё. А вся дискуссия пошла из-за того, что в заголовочном файле массив символов m_resolvedName уже превратился в полноценную строку типа std::wstring. И теперь сравнение работает правильно.
  • Подсчитаем баги в калькуляторе Windows
    +1
    Ммм… Возможно, но прошу дать ссылку на стандарт или другой документ где это уточняется. Сравниваются на равенство два указателя на wchat_t.
  • Подсчитаем баги в калькуляторе Windows
    +2
    Ещё нет, но будет. Решили опубликовать пока идёт бурное обсуждение новости, не дожидаясь перевода.
  • Подсчитаем баги в калькуляторе Windows
    +24
    При этом тестируемый анализатор кода показывает наличие множества десятистепенных ошибок, которые не нужно исправлять — их исправление не принесёт пользу пользователям, а значит лишь увеличит затраты на поддержку калькулятора.

    Всё верно. Почти наверняка эти ошибки несущественны или находятся в неиспользуемом коде. Однако, комментарий может быть неправильно трактован, поэтому я хочу добавить.

    Неэффективность правки старых ошибок, не означает неэффективность методологии статического анализа в целом.

    Смысл статического анализа, не в разовом поиске старых ошибок. Да, мы это делаем, но исключительно в целях демонстрации возможностей анализатора. С точки зрения методологии — это неэффективно.

    Смысл статичного анализа в том, чтобы использовать его регулярно. И тогда ошибки будут находиться ещё на написании кода, а не в процессе отладки, тестерами, пользователями и т.д. Т.е. цена исправления ошибки снижается с десятки и сотни раз. Да, статический анализ не способен найти все виды дефектов и заменить другие виды поиска ошибок. Нужно использовать комплекс мер. Однако, если хотя бы половина опечаток и прочих ляпов исправляется сразу, это уже круто.

    P.S. В PVS-Studio даже есть режим, когда он показывает ошибки только в новом и отредактированном коде. А всё старое, считается техническим долгом, с которым можно неспешно работать (или вообще не работать :).
  • Microsoft открыла код Калькулятора Windows
    +1
    Демоны призваны и выполняют вашу волю.
  • Microsoft открыла код Калькулятора Windows
  • Microsoft открыла код Калькулятора Windows
    +6
    Коллега уже в процессе написания заметки.
  • Microsoft открыла код Калькулятора Windows
    +17
    PVS-Studio. Поддерживаемые языки и компиляторы:
    • Windows. Visual Studio 2010-2017 C, C++, C++/CLI, C++/CX (WinRT), C#
    и т.д.
    • Windows. IAR Embedded Workbench, C/C++ Compiler for ARM C, C++
    • Windows/Linux. Keil µVision, DS-MDK, ARM Compiler 5/6 C, C++
    • Windows/Linux. Texas Instruments Code Composer Studio, ARM Code Generation Tools C, C++
    • Windows/Linux/macOS. GNU Arm Embedded Toolchain, Arm Embedded GCC compiler, C, C++
    • Windows/Linux/macOS. Clang C, C++
    • Linux/macOS. GCC C, C++
    • Windows. MinGW C, C++
    • Windows/Linux/macOS. Java

  • Статический анализатор Detekt для Kotlin
    0
    > Какие бывают статические анализаторы? Для java:
    А ещё для Java есть анализатор PVS-Studio.
  • Ложные срабатывания в PVS-Studio: как глубока кроличья нора
    0
    Я всегда за то, чтобы писать правильные программы. Но кажется здесь не тот случай, чтобы ожидать подвоха. Интересно кстати будет послушать мнение других участников.

    Если не менять объекты после const_cast, то тогда зачем вообще этот оператор нужен? :)

    Даже разработчики компиляторов так делают. Вот первый попавшийся фрагмент кода из Clang:

    static void getCLEnvVarOptions(
      std::string &EnvValue, llvm::StringSaver &Saver,
      SmallVectorImpl<const char *> &Opts)
    {
      llvm::cl::TokenizeWindowsCommandLine(EnvValue, Saver, Opts);
      for (const char *Opt : Opts)
        if (char *NumberSignPtr = const_cast<char *>(::strchr(Opt, '#')))
          *NumberSignPtr = '=';
    }
    
  • Ложные срабатывания в PVS-Studio: как глубока кроличья нора
    0
    Я не могу дать точный ответ, но вижу ситуацию следующим образом. Совсем чисто теоретически такое можно представить. Например, компилятор, как и анализатору, может предположить, что переменная не изменится и удалит проверку, заменив её на true. На практике такое не случится, так как компилятор не видит внутренности тела функции и не рискнёт сделать такую смелую оптимизацию. А вдруг внутри функции кто-то снимет константность, используя const_cast.
  • Ложные срабатывания в PVS-Studio: как глубока кроличья нора
    +1
    Нет. К сожалению, сделать объясняющее предупреждение намного сложнее, чем может показаться на первый взгляд.

    Уже предвижу комментарий, что полезно показать путь вывода правила (как работал анализ потока данных). Т.е. из каких условий и операций следует, что получится ложь/истина/индекс за границами массива и т.д. Я работал с такими инструментами и, к сожалению, пришел к выводу, что часто путь не помогает, а только ещё больше усложняет картину.

    Кстати, здесь бы и путь не помог. Вот переменная равна 0. Вот вызывается функция, которая не меняет эту переменную. Вот всегда истинное условие. То, что анализатор посчитал, что функция не меняет значение, это и так было понятно. Если же анализатор ещё начнёт отправлять ко всем объявлениям функций в системных заголовочных файлах… Человек тогда вообще потеряется в обилии данных и удалит анализатор :).
  • Ложные срабатывания в PVS-Studio: как глубока кроличья нора
    0
    Сам того не планируя, я начал писать статьи, посвященные развенчанию мифа, что статические анализаторы — это 90% шума и 10% пользы. Да, действительно, статические анализаторы в силу своей природы дают ложные срабатывания. Однако, подавляющее количество ложных срабатываний можно исключить, проведя минимальную настройку анализатора. Большинство бессмысленных срабатываний связано с неудачными макросами и опасным стилем кодирования (например, нет проверки указателя после malloc).

    Примечание. Кстати, в срабатываниях на макросах анализатор часто формально прав. Но с практической точки зрения это никого не волнует и получается, что это всё равно ложные предупреждения :).

    К сожалению, настроить анализатор недостаточно. Всё равно возникает ощущение, что многие срабатывания неверны. Иногда, когда начинаешь разбираться, это не так. Поэтому мои статьи наделены предостеречь программистов от поспешных выводов.

    Плюс ещё бывают такие интересные ситуации, как описаны здесь. С практической точки зрения это ложное срабатывание анализатора, хотя инструмент и не виноват. Тут собственно никакой и морали-то нет. Просто захотелось рассказать про эту ситуацию. Хотя нет, вру. Есть мораль: мы оказываем глубокую качественную поддержку. Становитесь нашим клиентом, и мы поможем побороть любое зло.
  • Ложные срабатывания в PVS-Studio: как глубока кроличья нора
    0
    typedef int near *PINT;
    foo(const PINT *x);
    
    В функцию передаётся указатель на константный объект. Значит, функция не может изменить объект, который пришёл в функцию из вне. В данном случае из вне приходит объект типа PACL (который на самом деле указатель). И вот этот объект (указатель) менять нельзя.
  • Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander
    0
    И авторы нас активно убеждают (я склонен им здесь поверить), что регулярное использование статического анализатора не оставляет ошибкам, которые он отлавливает, возможности добраться до момента, когда они накопятся на статью.
    Совершенно верно. Но однажды был случай, когда по недосмотру часть кода не проверялась. Результатом стала вот эта заметка :). Проверяем исходный код плагина PVS-Studio с помощью PVS-Studio.
  • Всё, что вы хотели знать о PVS-Studio и не постеснялись спросить
    +1
    Кстати, прорисовывается картина того, где можно нас будет повстречать в 2019 году. Как минимум, мы будем стоять со стендом здесь:
    • C++ Siberia, 14-16 февраля, Новосибирск, siberia-2019.cppug.ru
    • TeamLead Conf, 25-26 февраля, Москва, teamleadconf.ru/moscow/2019
    • AgileDays, 21-22 марта, Москва, Центр Международной Торговли, agiledays.ru
    • CodeFest X, 30-31 марта, Новосибирск, Экспоцентр, 2019.codefest.ru
    • JPoint, 5-6 апреля, Москва, Конгресс-центр ЦМТ, Краснопресненская наб., 12, 4й подъезд, jpoint.ru
    • Saint HighLoad++, 8 и 9 апреля, Санкт-Петербург, Park Inn Пулковская, www.highload.ru/spb/2019
    • ProductSense, 15-16 апреля, Москва, Radisson Славянская пл. Европы, 2, Москва, 121059 (м. Киевская), productsense.io
    • C++Russia, 19-20 апреля, Москва, Кутузовский просп., 2/1, стр. 1, Конгресс-парк гостиницы «Рэдиссон Ройал Москва», cppconf.ru
    • DotNext 2019 Piter, 15-16 мая, г. Санкт-Петербург, гостиница «Park Inn by Radisson Пулковская», площадь Победы, 1, dotnext-piter.ru
    • Positive Hack Days, 21–22 мая, Москва, www.phdays.com/ru
    • Saint TeamLead Conf, 23-24 сентября, г. Санкт-Петербург, пл. Победы, д.1, гостиница «Park Inn Пулковская»
    • C++ Conf, 11 октября, Москва, 1-й Зачатьевский пер., 4, «Инфопространство»
    • Joker 2019, октябрь 2019, г. Санкт-Петербург, Петербургское шоссе, 64/1, Экспофорум
    • DotNext 2019 Moscow, ноябрь 2019, г. Москва, Кутузовский просп., 2/1, стр. 1, Конгресс-парк гостиницы «Рэдиссон Ройал Москва»
    Приходите, пообщаемся, задарим сувениры. Плюс будет кое-что новое, чего небыло раньше.
  • Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander
    0
    «Или такие». Ссылочку пропустил :). Народ против PVS-Studio: дубль первый (см. комментарий).
  • Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander
    +2
    Спасибо за комментарий. Всё правильно написали. Но.

    Я зарёкся делать сравнения :). Чем тщательнее мы их делали, тем больше нас обвиняли в… как бы это помягче сказать то… В предвзятости и неадекватности сравнений! Можно конечно кому-то заплатить, чтобы он написал независимую статью. Но только тогда скажут, что она проплаченная :).

    Предлагаю написать такую заметку. Вам или любому желающему. Я серьезно буду рад и благодарен. Только просьба не повторять подобные недоработки при сравнении. Или такие :).

    Про Clang могу только сказать, что каждый раз проверяя код компилятора, мы находим там ошибки (1, 2, 3).

    Что ещё… Cppcheck? Он вообще не работает :). Недавно хотели добавить его в ночные прогоны, чтобы и он помимо других инструментов, код нашего анализировал проверял. Он просто не парсит множество файлов (мы пишем на современном C++). Пришлось выбросить.
  • Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander
    +3
    isspace (как настоящий, так и поддельный) не посчитает EOF как пробельный символ и цикл остановится.
  • Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander
    +6
    Он и так жаловался. :)
    #ifdef isspace
    #undef isspace
    #endif
  • Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander
    0
    Нет. На практике, это будет скорее всего неудачная диагностика. Мы подумаем.
  • Для тех, кто хочет поиграть в детектива: найди ошибку в функции из Midnight Commander
    +11
    ???