Повторная проверка проекта Notepad++

    PVS-Studio vs Notepad++
    Прошло более года, как мы проверили Notepad++ с помощью PVS-Studio. Интересно посмотреть, насколько анализатор PVS-Studio стал лучше, и что было исправлено в Notepad++ из прежних ошибок.

    Введение


    Итак, мы проверили проект Notepad++ взятый из репозитория 31 января 2012. Для проверки использовался анализатор PVS-Studio версии 4.54.

    Как уже было сказано, мы ранее проверяли этот проект. Ошибок нашли не много, но всё-таки что-то нашли. В новой версии проекта часть старых ошибок исправлена, а часть нет. Это странно. По всей видимости, прежняя заметка осталась незамеченной авторами Notepad++ и они не воспользовались PVS-Studio для проверки проекта. Возможно эта заметка все-таки привлечет авторов Notepad++, тем более что мы недавно изменили режим триала и все найденные с помощью PVS-Studio ошибки видны.

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

    Например, исправлена ошибка, описанная в предыдущей статье, которая касалась заполнения массива _iContMap. Было так:
    memset(_iContMap, -1, CONT_MAP_MAX);

    Исправленный вариант:
    memset(_iContMap, -1, CONT_MAP_MAX * sizeof(int));

    Зато вот эта ошибка, продолжает жить и здравствовать:
    bool isPointValid() {
      return _isPointXValid && _isPointXValid;
    };

    Диагностическое сообщение анализатора PVS-Studio:

    V501 There are identical sub-expressions to the left and to the right of the '&&' operator: _isPointXValid && _isPointXValid Notepad++ parameters.h 166

    Мы не будем возвращаться к тем ошибкам, которые были описаны в предыдущей статье. Рассмотрим то новое, что научился диагностировать анализатор PVS-Studio за прошедшее время:

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

    Новые найденные ошибки


    Ошибка N1. Выход за границы массива


    int encodings[] = {
      1250, 
      1251, 
      1252, 
      ....
    };
    
    BOOL CALLBACK DefaultNewDocDlg::run_dlgProc(
      UINT Message, WPARAM wParam, LPARAM)
    {
      ...
      for (int i = 0 ; i <= sizeof(encodings)/sizeof(int) ; i++)
      {
        int cmdID = em->getIndexFromEncoding(encodings[i]);
      ...
    }

    Диагностическое сообщение анализатора PVS-Studio:

    V557 Array overrun is possible. The value of 'i' index could reach 46. Notepad++ preferencedlg.cpp 984

    В цикле перебираются элементы массива «encodings». Ошибка заключается в неправильном условии остановки цикла. При последней итерации цикла происходит доступ к памяти за границей массива. Ошибку можно исправить, заменив условие "<=" на "<". Корректный код:
    for (int i = 0 ; i < sizeof(encodings)/sizeof(int) ; i++)

    Ошибка N2. Неправильное вычисление размера буфера


    typedef struct tagTVITEMA {
      ...
      LPSTR     pszText;
      ...
    } TVITEMA, *LPTVITEMA;
    
    #define TVITEM TVITEMA
    
    HTREEITEM TreeView::addItem(...)
    {
      TVITEM tvi;
      ...
      tvi.cchTextMax =
        sizeof(tvi.pszText)/sizeof(tvi.pszText[0]); 
      ...
    }

    Диагностическое сообщение анализатора PVS-Studio:

    V514 Dividing sizeof a pointer 'sizeof (tvi.pszText)' by another value. There is a probability of logical error presence. Notepad++ treeview.cpp 88

    Размер буфера вычисляется с помощью выражения «sizeof(tvi.pszText)/sizeof(tvi.pszText[0])». Это выражение не имеет смысла. В нём размер указателя делится на размер одного символа. Как исправить код сказать сложно, так как мы не знакомы с логикой работы программы.

    Ошибка N3. Неправильная проверка, что строка пустая


    size_t Printer::doPrint(bool justDoIt)
    {
      ...
      TCHAR headerM[headerSize] = TEXT("");
      ...
      if (headerM != '\0')
      ...
    }

    Диагностическое сообщение анализатора PVS-Studio:

    V528 It is odd that pointer to 'char' type is compared with the '\0' value. Probably meant: *headerM != '\0'. Notepad++ printer.cpp 380

    Указатель сравнивается с нулевым значением. Ноль задан литералом вида '\0'. Это подсказывает нам, что здесь забыто разыменование указателя. Корректный код:
    if (*headerM != '\0')

    Аналогичная ошибка допущена в другом месте:

    V528 It is odd that pointer to 'char' type is compared with the '\0' value. Probably meant: *headerR != '\0'. Notepad++ printer.cpp 392

    Ошибка N4. Опечатка в условии


    DWORD WINAPI Notepad_plus::threadTextPlayer(void *params)
    {
      ...
      const char *text2display = ...;
      ...
      if (text2display[i] == ' ' && text2display[i] == '.')
      ...
    }

    Диагностическое сообщение анализатора PVS-Studio:

    V547 Expression is always false. Probably the '||' operator should be used here. Notepad++ notepad_plus.cpp 4967

    Условие (text2display[i] == ' ' && text2display[i] == '.') никогда не выполняется. Символ не может одновременно являться и пробелом и точкой. Видимо здесь мы имеем дело с простой опечаткой и код должен был выглядеть следующим образом:
    if (text2display[i] == ' ' || text2display[i] == '.')

    Аналогичная ошибка допущена в другом месте:

    V547 Expression is always false. Probably the '||' operator should be used here. Notepad++ notepad_plus.cpp 5032

    Ошибка N5. Опечатка в условии


    int Notepad_plus::getHtmlXmlEncoding(....) const
    {
      ...
      if (langT != L_XML && langT != L_HTML && langT == L_PHP)
        return -1;
      ...
    }

    Диагностическое сообщение анализатора PVS-Studio:

    V590 Consider inspecting this expression. The expression is excessive or contains a misprint. Notepad++ notepad_plus.cpp 853

    Имеющуюся в коде проверку можно упростить. Тогда код будет выглядеть следующим образом:
    if (langT == L_PHP)

    Это явно не то, что хотел программист. Видимо здесь мы опять имеем дело с опечаткой. Корректный код:
    if (langT != L_XML && langT != L_HTML && langT != L_PHP)

    Ошибка N6. Неправильная работа с битами


    TCHAR GetASCII(WPARAM wParam, LPARAM lParam)
    {
      ...
      result=ToAscii(wParam,(lParam >> 16) && 0xff,
        keys,&dwReturnedValue,0);
      ...
    }

    Диагностическое сообщение анализатора PVS-Studio:

    V560 A part of conditional expression is always true: 0xff. Notepad++ babygrid.cpp 694

    В коде хотят извлечь третий байт из переменной 'lParam'. Из-за опечатки, код делает совсем не это. Ошибка заключается в том, что используется оператор '&&' вместо '&'. Корректный код:
    result=ToAscii(wParam,(lParam >> 16) & 0xff,
      keys,&dwReturnedValue,0);

    Ошибка N7. Недописанный код


    #define SCE_T3_BRACE 20
    static inline bool IsAnOperator(const int style) {
      return style == SCE_T3_OPERATOR || SCE_T3_BRACE;
    }

    Диагностическое сообщение анализатора PVS-Studio:

    V560 A part of conditional expression is always true: 20. lextads3.cxx 700

    Функция IsAnOperator() всегда возвращает 'true'. Корректный код:
    return style == SCE_T3_OPERATOR ||
                style == SCE_T3_BRACE;

    Ошибка N8. Код, который никогда не будет выполнен


    static void ColouriseVHDLDoc(....)
    {
      ...
          } else if (sc.Match('-', '-')) {
            sc.SetState(SCE_VHDL_COMMENT);
            sc.Forward();
          } else if (sc.Match('-', '-')) {
            if (sc.Match("--!"))
              sc.SetState(SCE_VHDL_COMMENTLINEBANG);
            else
              sc.SetState(SCE_VHDL_COMMENT);
          }
      ...
    }

    Диагностическое сообщение анализатора PVS-Studio:

    V517 The use of 'if (A) {...} else if (A) {...}' pattern was detected. There is a probability of logical error presence. Check lines: 130, 133. lexvhdl.cxx 130

    Если первое условие (sc.Match('-', '-')) истинно, то вторая проверка выполнена не будет. Это приведет к тому, что случай последовательность символов "--!" никогда не будет обработана правильно. По всей видимости, здесь часть кода лишняя и должно быть написано так:
    static void ColouriseVHDLDoc(....)
    {
      ...
          } else if (sc.Match('-', '-')) {
            if (sc.Match("--!"))
              sc.SetState(SCE_VHDL_COMMENTLINEBANG);
            else
              sc.SetState(SCE_VHDL_COMMENT);
          }
      ...
    }

    Ошибка N9. Лишний код


    Есть фрагменты кода, которые не приводят к проблемам, но являются избыточными. Приведем два примера такого типа:
    void Gripper::doTabReordering(POINT pt)
    {
      ...
      else if (_hTab == hTabOld)
      {
        /* delete item on switch between tabs */
        ::SendMessage(_hTab, TCM_DELETEITEM, iItemOld, 0);
      }
      else
      {
        if (_hTab == hTabOld)
        {
          /* delete item on switch between tabs */
          ::SendMessage(_hTab, TCM_DELETEITEM, iItemOld, 0);
        }
      }
      ...
    }

    Диагностическое сообщение анализатора PVS-Studio:

    V571 Recurring check. The 'if (_hTab == hTabOld)' condition was already verified in line 478. Notepad++ gripper.cpp 485

    Вторая часть кода не имеет никакого смысла и может быть удалена.

    А вот другой пример, где присутствуют лишние проверк. Указатели 'mainVerStr' и 'auxVerStr' всегда не равны нулю, так как это массивы, созданные на стеке:
    LRESULT Notepad_plus::process(....)
    {
      ...
      TCHAR mainVerStr[16];
      TCHAR auxVerStr[16];
      ...
      if (mainVerStr)
        mainVer = generic_atoi(mainVerStr);
      if (auxVerStr)
        auxVer = generic_atoi(auxVerStr);
      ...
    }

    Здесь можно написать проще:
    mainVer = generic_atoi(mainVerStr);
    auxVer = generic_atoi(auxVerStr);

    Проверки, показанные выше, встречаются в проекте Notepad++ неоднократно:

    V600 Consider inspecting the condition. The 'mainVerStr' pointer is always not equal to NULL. Notepad++ nppbigswitch.cpp 938

    V600 Consider inspecting the condition. The 'auxVerStr' pointer is always not equal to NULL. Notepad++ nppbigswitch.cpp 940

    V600 Consider inspecting the condition. The 'intStr' pointer is always not equal to NULL. Notepad++ preferencedlg.cpp 1871

    V600 Consider inspecting the condition. The 'intStr' pointer is always not equal to NULL. Notepad++ userdefinedialog.cpp 222

    V600 Consider inspecting the condition. The 'intStr' pointer is always not equal to NULL. Notepad++ wordstyledlg.cpp 539

    Выводы


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

    Зачем подолгу искать странное поведение программы, из-за неочищенного массива? Код «memset(_iContMap, -1, CONT_MAP_MAX)» легко и быстро находится статическим анализатором.

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

    Ещё раз хочется подчеркнуть мысль, что статический анализ это инструмент для регулярного использования. Это как расширение списка warnings, выдаваемых компилятором. Вы работаете с отключенными warnings и включаете их только изредка, когда есть настроение? Нет. Аналогично нужно относиться и к диагностическим предупреждениям, выдаваемым инструментами статического анализа.

    Как это сделать? Можно запускать анализ ночью на сервере. Можно использовать инкрементальный анализ, чтобы проверять только что модифицированные файлы. Если кажется, что анализ выполняется медленно и отнимает много ресурсов, то предлагаем ознакомиться с советами по повышению скорости работы.
    PVS-Studio
    Статический анализ кода для C, C++, C# и Java

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

      +9
      К сожалению, я знаю огромное количество разработчиков, которые допускают в своих проектах десятки, а иногда даже сотни варнингов. И я ничего не могу с этим поделать.
        0
        И как их проекты? Ими пользуются люди? Что говорят?
          0
          Некоторые в своих личных проектах такое допускают, некоторые работают и на работе так пишут. Некоторые лабы в универе так пишут. Особенно среди флешеров много такого народа. Я думаю отчасти поэтому флеш многие ругают. Даже в адобовских мануалах бывает код которые принебрегает типизацией и допускает варнинги.
            +1
            Ну лабам и «личным» проектам такое простительно, ведь ими никто не пользуется.

            А вот кстати еще на сайтах нередко сверху warning от php или еще кого-нибудь можно увидеть.
              +2
              Ну это вообще за гранью. Видел такие сайты… Такие варнинги даже в логах не должны допускаться, все следует исправлять) А отдавать на продакшне лог браузеру…
                +1
                Если бы вы видели что товрится с сайтом, если включается полный репорт ошибок.
                10/11 контента становится нотайсы и варнинги (только самописные сайты без cms и фреймворков).

                Не понимаю, почему нельзя соблюдать простейшие правила и написать код без единой @ и нотайс ошибки.
              +2
              Попробуйте для развлечения скомпилировать SQLite3 — просто возьмите все исходники, добавьте их в проект и скомпилируйте. Предупреждений будут сотни, но никто же из-за этого не отказывается от использования SQLite.
                0
                Вероятно у них другой способ сборки и сборка типа «добавьте исходники в проект» — просто не работает.
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    Это же gcc, правда? А речь о Visual C++.
                    • НЛО прилетело и опубликовало эту надпись здесь
                +2
                к сожалению, такие проекты потом достаются еще и «в наследство». 300К строк кода, соответственно тысячи ворнингов, фиксить которые просто опускаются руки
                  +2
                  Я считаю, в таком проекте исправление ворнингов — это первое, что надо сделать. Параллельно с исправлением получается неплохое первое знакомство.
                    0
                    … особенно, если вам надо прикрутить небольшой вывод в файл за пару дней.
                  +3
                  допускают в своих проектах десятки, а иногда даже сотни варнингов

                  Не стоит забывать, что в отдельно взятых компиляторах отдельно взятые предупреждения сделаны настолько бездумно, что выдаются по поводу и без, и попытки доработать свой код напильником, чтобы они не выдавались, чаще приводят к ухудшению кода. Так что «допускает предупреждения в коде» — само по себе не провинность.
                    0
                    Я при этом не понимаю как этим можно пользоваться. А новые варнинги при разработке как учитывать? Сверять по количеству варнингов?
                      0
                      Я не буду за это агитировать, но один из способов — игнорировать все. По факту C++ дает кучу возможностей отстрелить себе ногу и все остальные части тела, которые никакие предупреждения компилятора выявить не помогут. Соответственно, логика у этого способа такая: в коде и так много что много где может сломаться, так что предупреждением больше, предупреждением меньше — на погоду не влияет. С виду работает — и ладно.

                      Как пользоваться? По сути — никак не пользоваться.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          Проще решать запретом на компиляцию при наличии варнингов, естественно под основным компилятором, под который ведётся разработка. Правим код так чтобы их не было. Там где другие компайлеры варнинги выдают, нужно проверить и забить.
                            0
                            Не полетит. На первый взгляд, это мотивирует разработчиков делать так, чтобы «чертов компилятор не выдавал предупреждений», а на самом деле — это мотивирует их «сделать что угодно, чтобы руководство не доставало». Разработчики будут тупо глушить предупреждения или портить код, чтобы предупреждения не выдавались.

                            Заметьте, я не предлагаю игнорировать все предупреждения, я только привожу этот способ как один из реально используемых на практике.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                надо бы ставить больше скобок для ясности

                                Отличный пример.

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

                                Почему так происходит? Потому что предупреждение плохо продумано. В большинстве случаев ситуация, когда «неплохо бы поставить скобки», сопровождается значительной сложностью выражения. Компилятору бы предложить расписать это выражение на несколько, а он выдает не особо полезное предупреждение. Пользователь глушит предупреждение, формально все в порядке, но однажды можно посадить ошибку в код.
                                  0
                                  Но если предупреждение, которое заставляет ставить скобки в выражении a && (b || c), отключить, пропадут вобще все варнинги, связанные с приоритетом операторов, например глубоко неочевидное a + b << c.

                                  Приходится покориться gcc, и ставить скобочки в логических выражениях.
                            0
                            А я за немного другой подход.
                            Warning'и можно отключить локально — только в том месте, где мы о нем знаем.

                            Итак, отключаем локально все ворнинги (да, работа еще та, но любой скриптовый язык в этом поможет), проверяем, что ничего не сломали (на всякий случай — код-то не менялся), а потом начинаем жизнь с чистого листа — не допускаем появления новых предупреждений и можем даже на радостях поменять настройки проекта — включить treat warnings as errors.

                            По мере рефакторинга отдельных частей можно будет возвращатсья к игнорированным предупреждениям и вычищать их «по правильному»
                        0
                        Картинка не грузится :(
                          +1
                          Сегодня крупный хостер 1gb.ru забыл продлить свой домен. Из-за него многие сайты не открывались. Сейчас проблема исправлена, но видимо DNS не везде обновился.
                          –6
                          «По всей видимости, прежняя заметка осталась незамеченной авторами Notepad++ и они не воспользовались PVS-Studio для проверки проекта.»

                          А что не позволило вам самим написать письмо?
                            0
                            1gb.ru забыл продлить свой домен, и авторы Notepad++ не смотри активировать триальную версию PVS-Studio ;)
                              +16
                              Спасибо, что задали актуальный вопрос.

                              Я пишу всем. Но если моё письмо попадает в спам или мой баг-репорт удаляют (а такое случалось), то мне всё равно. Если не уважительно относятся к людям, присылающих информацию, то почему я должен бегать за автором, чтобы «отдать фотографию»?
                                –18
                                А написать это нормально — не могли?
                                  +14
                                  Вы просто не представляете насколько оригинальный вопрос (а вы писали авторам?) задали. Посмотрите историю публикаций на Хабре. В КАЖДОЙ статье находится желающий спросить это.
                                    –6
                                    Учитывая манеру написания текста а тем более процитированного куска. Это совершенно нормальная реакция. Если бы в тексте было не высокомерное «По всей видимости, прежняя заметка осталась незамеченной авторами Notepad++ и они не воспользовались PVS-Studio для проверки проекта.» А текст из его ответа на мой вопрос " Но если моё письмо попадает в спам или мой баг-репорт удаляют (а такое случалось), то мне всё равно." Я бы и не спрашивал.
                                      +9
                                      А мне вот без разницы, с высокомерием или нет мне указывают на ошибки. Ведь от этого ошибки не перестанут быть ошибками. Я просто беру и стараюсь все исправить. А оставлять ошибки только из за того, что вам не понравилось, как вам на них указали — это глупость, ведь пострадают в первую очередь ваши пользователи и вы сами. А тому, кто написал про ошибку может вообще наплевать будет.
                                        +6
                                        Чего вы хотите от автора? Он написал заметку, написал письмо, написал вторую заметку. Все в чем он провинился — сделал безобидное замечание. Кто знает почему осталась незамеченной заметка? Может они ее и в глаза не видели? Может письмо потерялось?
                                        Здесь нет никаких претензий, на мой взгляд.
                                          +5
                                          Назрела проблема одинаковых вопросов, которая стала меня беспокоить. Отсюда и мои нездоровые ответы… Не знаю пока что делать с этим…

                                          Высокомерие тут ни при чём. Я просто не хочу, делать из своих статей каку. Их читать тогда будет невозможно. Мне придется в каждую статью вставлять два листа одинакового текста, и делать заголовок — «Прежде чем хотите написать комментарий — прочтите это». :)

                                          А внутри писать про то, сообщил ли я ошибки разработчикам, есть ли версия под Linux и почему её нет, почему PVS-Studio не работает на Visual Studio Express edition и еще несколько вопросов, которые обязательно задают каждый раз.
                                            +1
                                            Написать «По всей видимости, прежняя заметка осталась незамеченной авторами Notepad++ и они не воспользовались PVS-Studio для проверки проекта а направленное им письмо они проригнорировали.»?
                                              0
                                              Disclaimer со ссылкой на страницу, где это все описывается, в начале каждой статьи. Только ссылка должна называться не «дисклеймер тут», а, к примеру, «наша позиция по вопросу баг-репортов» или что-то вроде.
                                                0
                                                Может быть и так, но… «Наша позиция по вопросу баг-репортов» — это не та ключевая информация, которую мы хотим донести до людей нашими статьями.

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

                                                  Зачем же тратить на них нервы, вы и так знаете, что новые публикации по PVS аудитория хабра всегда ждет.
                                          +3
                                          Простите, но кажется Вы мои статьи уже читали. Если так, то не понимаю, как можно зажать такой оригинальнейший вопрос. :)
                                            –4
                                            Вот именно что читал, поэтому процитированный текст и вызвал глубокое удивление.
                                          +1
                                          мой баг-репорт удаляют (а такое случалось)

                                          Почему удаляют? Считают спамом?
                                            +3
                                            Без комментариев.

                                            В смысле удаляют без комментариев :-).
                                              +1
                                              На ум приходит два варианта:
                                              1. Из-за обилия ссылок на сами_знаете_что.
                                              2. Жертвы проверки стыдятся своих ошибок.
                                                0
                                                1. Из-за обилия ссылок на сами_знаете_что.

                                                А как без ссылок? Как людям понять с помощью чего найдены ошибки?
                                                  +2
                                                  обилия
                                                    0
                                                    Я был бы та-а-а-а-ак счастлив, если можно было бы один раз упомянуть PVS-Studio в статье и все. Но люди думают, что эти ошибки:
                                                    1. Найдены руками.
                                                    2. Найдены разными другими инструментами.
                                                    3. И даже не найдены вообще :-).

                                                    что приходится упоминать чаще. Особенность человеческой психики видимо.
                                                      0
                                                      В статье — нормально, а в письме или багрепорте наверно хватит и одного упоминания.
                                                        –1
                                                        В этой ветке комментариев показан очень хороший пример человеческой невнимательности. А Вы говорите один раз упомянуть и все.
                                                        0
                                                        даже не найдены вообще

                                                        Любопытно, о чем здесь речь.
                                                          0
                                                          Пишешь статью «в проекте XXX найдены следующие ошибки». Первый коммент: «Да ладно, в реальных проектах такого не бывает...»
                                                    0
                                                    А может ещё проще. Например, попадаем в спам из-за anal (code analyzer). Давно чешутся руки помучить парочку писателей антиспамовских поделок. Количества вреда от них равно количеству вреда от самого спама.

                                                    Ещё вспоминается случай, когда из-за лошади, публикация статьи на одном сайте была автоматически отклонена. Ну конечно, если «horse», то это значит про секс будет… Тьфу…
                                                      0
                                                      «Давно чешутся руки помучить парочку писателей антиспамовских поделок»
                                                      Учитывая их количество, этот процесс тоже необходимо автоматизировать.

                                                      «Количества вреда от них равно количеству вреда от самого спама.»
                                                      А то и больше!
                                                        0
                                                        Пиши static verification tool!
                                                    +1
                                                    Вам пора давно составить мини FAQ для хабра, с заготовленными ответами на такие вопросы, и вставлять в конец статьи, чтобы каждый раз заново не отвечать :)
                                                      +1
                                                      Наверное так и сделаю. :-)
                                                  0
                                                  Спасибо за статью, остался только один вопрос. Статическим анализатором PVS-Studio нужно пользоваться регулярно?
                                                    +1
                                                    Можно как угодно, но наибольшую пользу приносить постоянное её использование.
                                                      +1
                                                      Смысл статического анализа примерно в следующем: не знающая усталости программа может перепахать тонны кода и очень надежно найти там некоторые закономерности, возможно, указывающие на наличие ошибки.

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

                                                      Тогда логично, чтобы анализ выполнялся после каждой правки (PVS-Studio это делает в режиме инкрементального анализа). Это при условии, что шума не слишком много, иначе вы тратите время на разбирательство — проблема там или нет и только замусориваете код вставками для подавления предупреждения.
                                                        0
                                                        Про инкрементальный анализ.

                                                        Две задачи, которые решаются с помощью инкрементального анализа:

                                                        1. Автоматизация запуска анализатора сразу же после компиляции на машине разработчика.

                                                        2. Получение выгоды от внедрения статического анализа в большом проекте БЕЗ необходимости проверки всего проекта. Фактически вы можете начать внедрять статический анализ кода, проверяя только тот код (те файлы), который модифицируется разработчиками в настоящее время и не лезть в кучу старых файлов, которые не модифицируются
                                                        +2
                                                        Исправлять ошибки в (развивающейся) программе нужно регулярно? Или достаточно один раз исправить все ошибки, а потом просто продолжать писать новый код без ошибок? Ответьте для себя на эти вопросы — от этого и зависит «регулярность приема» PVS-Studio.
                                                        +4
                                                        А я все думал, что будет когда закончатся известные открытые проекты :)
                                                        Вон оно как оказалось, по второму кругу пошли!
                                                          0
                                                          Кстати давно интересно, почему лицензия минимум на 5 разработчиков.
                                                          Или просто продавать дешевле 3500 eur вам не интересно?
                                                            –2
                                                            Статический анализатор рационален в средних и крупных проектах. Там где над проектом трудится 1-2 человека, применять статический анализ конечно тоже полезно, но не так. Причем, индивидуальные разработчики называют ожидаемой ценой 100$-200$. Это понятно. Для их маленьких проектов платить больше за инструмент не первой необходимости, смысла нет. Но и нам нет смысла сопровождать 3500/(200*1.3) = 23 разработчика, вместо одной командой лицензии. Суеты много, денег мало. В сфере статического анализа поддержка стоит дорого и с 100-200$ можно запросто уйти в минус. Вариант «продовать без поддержки» мы не рассматриваем.

                                                            Другая причина — люди хитрят. Покупают одиночную лицензию, ведь он будет пользоваться «один». И при этом «как-то забывает», что проект пишет целая команда. Или просто он действительно на поддержке проекта сейчас один, но потрачено на этот проект было до этого многие человеко-годы. Зачем нам это? Раз проект создавала/создает команда, то и платить надо за команду.
                                                            +4
                                                            Скажите, а Вы не пробовали сравнивать результаты, получаемые с помощью PVS-Studio с результатами, выдаваевыми такими программами как Frama-C и VCC (Verified C Compiler)?
                                                              –4
                                                              Нет. А из каких соображений интересуетесь?
                                                                +6
                                                                Ну это довольно известные статические верификаторы для Си-кода, второй даже имеет отличную интеграцию с Visual Studio. Плюс я довольно неплохо знаю что они имеют и как они это делают. В их публикациях есть много сравнений между собой и с разными другими программами, но я никогда даже не слышал упоминания о Вашей разработке — поэтому мне стало интересно, может быть Вы делали какие-то сравнения.

                                                                Я бы еще и про PeX спросил (у него тоже есть статическая верификация) — но увидел, что Ваш тул не работет с managed code, и не стал. А так было бы тоже интересно сравнить.
                                                              0
                                                              Хорошо пинать такие проекты, как Notepad++. Его автор вам скорее всего не ответит. Он ни разу не претендует на то, чтобы проект служил идеалом чистого и качественного кода. Да и не требуется это в таком проекте, по большому счету.

                                                              Если бы вы находили и показывали ошибки в проектах, на которые тратятся сотни человеко-часов тестирования и ревью, ошибки, которые могут стоить очень дорого (к примеру уязвимости), это бы гораздо убедительнее демонстрировало пользу от вашего продукта.
                                                                0
                                                                Почитайте наши статьи про Chromium, Clang, Qt и т.п. Список здесь (http://www.viva64.com/ru/pvs-studio/) внизу страницы.
                                                                  0
                                                                  Спасибо, я их читаю :) и они убедительны.
                                                                  Пожалуй мне следовало сформулировать так: «Когда вы находите и показываете… намного убедительнее демонстрирует ...»
                                                                  0
                                                                  ошибки, которые могут стоить очень дорого (к примеру уязвимости)

                                                                  Не понимаю этой логики. Почему-то уязвимость — это сразу серьезная проблема, а если, скажем текст, в редакторе иногда искажается (это я привел гипотетический пример проблемы, которая в принципе могла бы быть в Notepad++), и это мешает работать, то это уже как будто и не проблема. Нашли уязвимость — хорошо, нашли какой-нибудь мелкий дефект в редакторе, из-за которого не так прыгает каретка, — тоже хорошо.
                                                                    0
                                                                    Ещё хуже когда из-за ошибки в редакторе возникает уязвимость. Показывает одно, а пишет в файл другое.

                                                                    Ни разу себе не говорили «Не мог я такого написать!»? А Notepad++ пользуетесь? ;)
                                                                    0
                                                                    Кстати, Вы можете высказать предложения, что было-бы интересно проверить. Мы будем рады, если Вы напишите нам (прочитав в начале это :-).
                                                                  0
                                                                  как насчет варнингвара: vim VS np++ )))
                                                                    +4
                                                                    Зачем этот огрызок от редактора? Даёшь vim vs emacs!
                                                                      –1
                                                                      да ну вас, я за честные выборы
                                                                        0
                                                                        Точно-точно! Очень хочется посмотреть, насколько внимательно бородач пишет код (:
                                                                      0
                                                                      Каждый раз читая ваши статьи я удивляюсь — как оно ( исследуемый проект ) вообще работает?
                                                                      хотя notepad++ у меня ни разу не падал и не глючил
                                                                        0
                                                                        Очень просто.

                                                                        Во-первых, все заметные и важные ошибки обычно вылавливают другими способами. Программа падает — отладили, исправили. На такие обзоры остаются те ошибки, которые не проявились достаточно ярко, чтобы их начали искать.

                                                                        Во-вторых, оставшиеся ошибки вообще не обязаны очевидно проявляться. Где-то на вход подаются только такие данные, при которых ошибка не проявляется. Где-то ошибка проявляется, но код вызывается крайне редко. В итоге ошибок, которые хотя бы как-то заметно проявляются при реальной работе, очень мало.

                                                                        Это такая ирония — вроде бы статический анализ много чего нашел и должен дать улучшение качества кода, а по факту измерить это улучшение совсем не просто.
                                                                          0
                                                                          Это такая ирония — вроде бы статический анализ много чего нашел и должен дать улучшение качества кода, а по факту измерить это улучшение совсем не просто.


                                                                          Статический анализ нужен тогда, когда у разработчиков возникает вопрос: «А что ЕЩЕ я могу сделать для того, чтобы код был лучше?».
                                                                            0
                                                                            При этом не надо забывать, что многие разработчики до этого состояния не доходят никогда. Хотя бы потому что качество кода — что-то эфемерное и занудное, а попробовать новый фреймворк или прикрутить новые фичи очень хочется.
                                                                              0
                                                                              Конечно, о том и речь, что лабораторным работам и «домашним» проектам статический анализ не нужен. Что бы ни говорили те, кто заявляют, что за $100 они бы домой себе купили PVS-Studio…
                                                                                0
                                                                                Очень вы напрасно думаете, что только в лабах и домашних проектах люди не заботятся о качестве кода.
                                                                                  +1
                                                                                  Где НЕ заботятся меня не очень интересует. Мои клиенты это те, кто заботятся.
                                                                            0
                                                                            Не стоит забывать, что статический анализ позволяет быстро найти то, что относится к «во-первых». Зачем тратить силы на отладку и тем более на отрытие бага в отделе тестирования, если часть из них можно выловить моментаьно. Это очень важный момент, который постоянно упускают из виду.
                                                                              0
                                                                              Да, но здесь снова ирония. Прежде чем люди согласятся пользоваться статическим анализом постоянно, хорошо бы, чтобы они основательно попробовали его один раз ну или хотя бы внимательно посмотрели на список дефектов, которые вы находите и им присылаете, а они даже последнего сделать не могут.

                                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                        Самое читаемое