PVS-Studio наконец то добрался до Boost

    Boost and PVS-Studio

    Мы уже давно хотели проверить библиотеку Boost. У нас не было уверенности, что результатов проверки хватит на статью. Однако, желание не пропадало. Два раза мы пытались сделать это, но отступали, не разобравшись, как заменить вызов компилятора на вызов PVS-Studio.exe. Теперь мы вооружились новым инструментарием, и третья попытка оказалась удачной. Итак, возможно ли найти в Boost ошибки?


    Boost


    Boost — собрание свободно распространяемых библиотек, расширяющих функциональность C++. Проект был создан после принятия стандарта C++, когда многие были недовольны, что в стандарт не были включены некоторые библиотеки. Проект является своего рода «испытательным полигоном» для различных расширений языка, и часть библиотек являются кандидатами на включение в следующие стандарты C++. Ссылки:

    • Сайт библиотеки Boost.
    • Wikipedia. Boost.
    • Скачать Boost.


    Boost представляет собой «тяжёлый» код, в котором активно используются сложные шаблоны. Эта библиотека в каком-то смысле является тестом для компиляторов. Часто бывает, что какой-то компилятор способен скомпилировать только часть проектов из современной библиотеки Boost.

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

    Напомню существующие варианты проверки проектов с помощью PVS-Studio.

    Если есть обыкновенный проект для Visual Studio или Embarcadero C++Builder


    Здесь всё просто. Анализ проекта может быть выполнен непосредственно из среды разработки. Другой вариант — запустить PVS-Studio из командной строки и на выходе получить файл с результатами проверки. Этот режим удобно использовать в системах непрерывной интеграции (например Cruise Control, Draco.NET или Team Foundation Build). Подробнее этот режим описан в документации. О взаимодействии с системами непрерывной интеграции можно посмотреть здесь.

    Если проекта нет (или проект по сути представляет собой замаскированный makefile)


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

    Именно этот подход нам и следовало использовать, чтобы проверить Boost. Жаль, мы оказались магами недостаточного уровня или просто ленивыми. Не удавалось разобраться в системе сборки, чтобы передать консольной версии анализатора все необходимые параметры.

    На помощь нам пришел новый третий вариант проверки проектов


    О этом новом режиме уже упоминал мой коллега в недавней заметке "Из подвала секретной лаборатории разработчиков PVS-Studio". Не надо полноценно интегрироваться в систему сборки. Достаточно просто получить препроцессированные *.i файлы. Это намного проще. Именно так мы и поступили.

    Затем, используя прототип нового инструмента (PVS-Studio Standalone), мы выполнили анализ всех *.i файлов и получили долгожданный отчёт. В этой же программе можно удобно работать со списком ошибок и вносить исправления в код.

    Я надеюсь, мы включим этот инструмент в состав дистрибутива через несколько версий. Возможно, это произойдет в PVS-Studio 5.10.

    Пара слов о режиме, которого нет, но о котором мечтаем


    Мы потихоньку подбираемся к отслеживанию действий компилятора. Этот режим также будет относиться к инструменту PVS-Studio Standalone. Будут отслеживаться все запуски компилятора и собираться ключи его запуска. Таким образом, будет достаточно выполнить следующие действия. Приказать — «следи». Собрать проект с помощью любой системы сборки. Сказать — «готово». И анализатор будет знать, как теперь проверять проект. Конечно, если структура проекта или параметры изменится, этот процесс придётся повторить. Ладно, помечтали, а теперь вернемся к проверке Boost.

    Ощущение безнадежности


    Я был готов, что статью про Boost написать не получится. У этого грустного предположения были следующие предпосылки.

    Большое количество компиляторов и инструментов


    Boost собирается большим количеством компиляторов. Какими-то частично, какими-то полностью. Я не проводил изучения этого вопроса. Но, как я понимаю, Boost неплохо собирается с помощью Visual C++, Intel C++, Sun Studio, Compaq C++, GCC, Clang. Каждый компилятор обладает своими уникальными диагностическими способностями. А их суммарное использование должно обеспечить очень высокое качество кода. Один компилятор найдёт ошибку A, второй ошибку B и так далее.

    Более того, библиотека Boost является своего рода полигоном испытания различных инструментов и статических анализаторов кода. Поскольку в Boost активно используются различные современные возможности языка Си++, то всегда интересно знать сможет ли инструмент разобраться с таким кодом. В результате, Boost проверен и перепроверен различными анализаторами кода.

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

    Большое количество пользователей


    Библиотека Boost используется во многих проектах. Одно время мы и сами использовали Boost в проекте PVS-Studio (тогда ещё Viva64). Использовались механизмы для работы с регулярными выражениями, с конфигурационными файлами и пара других мелочей. Потом мы поняли, что регулярные выражения это тупиковый путь, и постепенно они исчезли из кода. Таскать Boost только из-за конфигурационных файлов было сомнительно. Тем более выяснились некоторые неприятные недостатки. Например, в имени файла нельзя использовать '#'. Этот символ считается за начало комментария. В нашем конкретном случае Boost не прижился, однако, это, безусловно, очень полезная библиотека.

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

    Шаблоны


    В Boost много шаблонных классов. Их почти невозможно проверить, если они не инстанцируются. Например ,Visual C++ вообще не разбирает шаблонные классы, если они не используются. В неиспользуемом классе можно написать любую белиберду и файл успешно скомпилируется Достаточно, чтобы соблюдалось количество открывающихся и закрывающихся скобок и кавычек (), <>, {}, [], "", ''.

    Анализируя шаблонный класс, приходится идти на компромисс между количеством ложных срабатываний и пропуском ошибок. Поясню на простом примере, в чем состоит сложность.
    template <typename T>
    bool IsNAN(T x) { return x != x; }

    Эта функция определяет, является ли значение переменной «не числом» (Not-a-Number). Эта функция имеет смысл для типов float/double/long double. Для целочисленных типов такое сравнение бессмысленно, и указывает на наличие ошибки.

    Как быть, если тип неизвестен? Неразрешимый вопрос. Для полноценной проверки все шаблоны должны использоваться во всех возможных вариантах. Более того. Шаблоны нужно ещё разобрать. А это сложная задачка. Например, у PVS-Studio есть ряд проблем с этим. Что-то он может разобрать и даже попытаться инстанцировать, а что-то нет.

    В любом случае анализ шаблонов очень неблагодарное дело. А в Boost их полным полно.

    Оценка шансов


    Оценивая и размышляя о всём вышесказанном, я был настроен пессимистично. Я предполагал, что может вообще не найтись ничего дельного. Или найдется одна ошибка, из которой всё равно статью не сделаешь.

    Найти 3-4 ошибки в Boost я посчитал бы огромным достижением.

    Давайте посмотрим, что удалось найти PVS-Studio 5.06 в Boost 1.55 (скачана версия на этапе разработки).

    Результаты проверки Boost


    Ошибок или подозрительных мест конечно найдено не много. Но я считаю результат анализа просто великолепным.

    Фрагмент N1. Опечатка


    point3D operator/(const point3D &p1, const point3D &p2)
    {
      return point3D( p1.x/p2.x , p1.y/p2.y , p1.z/p1.z );
    }

    Диагностическое сообщение PVS-Studio: V501 There are identical sub-expressions to the left and to the right of the '/' operator: p1.z / p1.z lorenz_point.cpp 61

    В третьем аргументе функции, переменная 'p1.z' делится на саму себя. Скорее всего, она должна делиться на 'p2.z'.

    Фрагмент N2. Ошибка инициализации членов класса


    BOOST_UBLAS_INLINE
    compressed_matrix_view(const compressed_matrix_view& o) :
      size1_(size1_), size2_(size2_),
      nnz_(nnz_),
      index1_data_(index1_data_),
      index2_data_(index2_data_),
      value_data_(value_data_)
    {}

    Первое диагностическое сообщение PVS-Studio (остальные приводить нет смысла): V546 Member of a class is initialized by itself: 'size1_(size1_)'. sparse_view.hpp 193

    Члены класса инициализируются сами собой. И получается, что остаются неинициализированными. Наверное, должны были использоваться данные из объекта 'o'. Мне кажется, конструктор должен был выглядеть так:
    BOOST_UBLAS_INLINE
    compressed_matrix_view(const compressed_matrix_view& o) :
      size1_(o.size1_), size2_(o.size2_),
      nnz_(o.nnz_),
      index1_data_(o.index1_data_),
      index2_data_(o.index2_data_),
      value_data_(o.value_data_)
    {}


    Фрагмент N3. Неточность в освобождении памяти


    static std::basic_string<wchar_t> get(char const* source = "")
    {
      ....
      std::auto_ptr<wchar_t> result (new wchar_t[len+1]);
      ....
    }

    Диагностическое сообщение PVS-Studio: V554 Incorrect use of auto_ptr. The memory allocated with 'new []' will be cleaned using 'delete'. tree_to_xml.ipp 71

    Контейнер 'std::auto_ptr' является неподходящим типом для хранения указателя на массив объектов. Для уничтожения массива будет использоваться оператор 'delete', а не 'delete []'. Скорее всего не фатальная, но самая настоящая ошибка. Опасность таких ошибок хорошо описана в статье "delete, new[] в C++ и городские легенды об их сочетании".

    Аналогичная ошибочка присутствует здесь: generate_static.hpp 53.

    Фрагмент N4. Классика жанра. SOCKET


    По-моему, редко можно встретить проект, где нет хотя бы одной ошибки, связанный с использованием типа SOCKET. Напомню суть беды. Нередко статус операции проверяют следующим образом:
    SOCKET s = Foo();
    if (s < 0) { Error(); }

    Такая проверка незаконна. Следует сравнивать переменную с константой SOCKET_ERROR. Однако, программисты часто ленятся и пишут «socket < 0» или «socket >= 0».

    В Linux тип SOCKET знаковый и подобная халтурная работа сходит с рук. В Windows тип SOCKET является беззнаковым. В результате, условия всегда ложны и ошибочные ситуации никак не обрабатываются.

    Нашлась такая ошибка и в Boost.
    typedef SOCKET socket_type;
    
    class socket_holder
    {
      ....
      socket_type socket_;
      ....
      socket_type get() const { return socket_; }
      ....
    };
    
    template <typename Socket>
    boost::system::error_code accept(....)
    {
      ....
      // On success, assign new connection to peer socket object.
      if (new_socketnew_socket.get() >= 0)
      {
        if (peer_endpoint)
          peer_endpoint->resize(addr_len);
        if (!peer.assign(impl.protocol_, new_socket.get(), ec))
          new_socket.release();
      }
      return ec;
    }

    Диагностическое сообщение PVS-Studio: V547 Expression 'new_socket.get() >= 0' is always true. Unsigned type value is always >= 0. win_iocp_socket_service.hpp 436

    В Windows этот фрагмент кода будет работать не так, как ожидал программист. Условие «new_socketnew_socket.get() >= 0» выполняется всегда.

    Фрагмент N5. Опечатка


    void set_duration_style(duration_style style)
    {
      duration_style_ == style;
    }

    Диагностическое сообщение PVS-Studio: V607 Ownerless expression 'duration_style_ == style'. base_formatter.hpp 51

    Думаю особенно комментировать здесь нечего. Полагаясь на название функции, мне кажется, здесь должно быть написано: «duration_style_ = style». Просто опечатка.

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

    Вы не делаете таких ошибок? Ещё раз посмотрите этот пример (и разные другие примеры). Думаю, этот код писал не студент. Просто мозг человек не совершенен, и мы все допускаем ошибки. Это нормально и нет ничего плохого, чтобы подстраховаться, используя различные вспомогательные инструменты: статические анализаторы кода, методологию TDD, обзоры кода.

    Фрагмент N6. Потенциально опасное чтение из потока


    template< typename CharT >
    basic_settings< CharT > parse_settings(std::basic_istream< CharT >& strm)
    {
      ....
      string_type line;
      while (!strm.eof())
      {
         std::getline(strm, line);
    
         const char_type* p = line.c_str();
         parser.parse_line(p, p + line.size());
    
         line.clear();
         ++line_number;
      }
      ....
    }

    Диагностическое сообщение PVS-Studio: V663 Infinite loop is possible. The 'cin.eof()' condition is insufficient to break from the loop. Consider adding the 'cin.fail()' function call to the conditional expression. settings_parser.cpp 285

    Этот код делает, что должен делать — читает данные из файла. Анализатору не нравится, что код может привести к зацикливанию. Я не знаю, как точно смоделировать опасную ситуацию, но попробую предположить. Пусть файл находится на сетевом диске. В момент чтения, соединение разрывается. Функция 'eof()' будет возвращать 'false'. Ведь файл не прочитан до конца. Чтобы отлавливать такие ситуации рекомендуется использовать функцию 'eof()' в паре с функцией 'fail()'. В приведенном фрагменте функция 'fail()' нигде не зовется, а значит возможна неприятная ситуация при работе программы. Из таких мелочей и складывается надежность программ и их устойчивость к ошибкам.

    И ещё одна потенциально опасное место: V663 Infinite loop is possible. The 'cin.eof()' condition is insufficient to break from the loop. Consider adding the 'cin.fail()' function call to the conditional expression. adjacency_list_io.hpp 195

    Фрагмент N7. Подозрительное вычитание


    template<> 
    struct identity_element<boost::gregorian::date_duration>
    {
      static boost::gregorian::date_duration value()
      { 
        return
          boost::gregorian::date(boost::gregorian::min_date_time) -
          boost::gregorian::date(boost::gregorian::min_date_time); 
      }
    };

    Сообщение анализатора PVS-Studio: V501 There are identical sub-expressions 'boost::gregorian::date(boost::gregorian::min_date_time)' to the left and to the right of the '-' operator. gregorian.hpp 57

    Мне кажется, или эта функция всегда будет возвращать 0?

    Заключение


    Я считаю, что анализатор PVS-Studio великолепно показал себя. Найти хоть что-то в Boost это огромное достижение. И анализатор сделал это!
    PVS-Studio
    Static Code Analysis for C, C++, C# and Java

    Comments 166

    • UFO just landed and posted this here
        +35
        • UFO just landed and posted this here
            +17
            С нетерпением жду статьи «PVS-Studio наконец-то добрался до PVS-Studio»! :)
              0
              Да-да.
                +1
                Впринципе я догадывался, что вы регулярно свой код проверяете, но статью буду ждать :)
                Хотя бы впечатления от того как часто вы выявляете ошибки и какие из них вам понравились :))
                +1
                Мне кажется, это так же опасно, как искать google в Гугле. :)
                  0
                  R#, кстати, на C# в основном написан
                  0
                  Андрей уже неоднократно писал, что сами себя они постоянно проверяют ;)
                0
                На тему PVS-Studio Standalone и Linux, возможно будет интересна вот эта новая заметка — "PVS-Studio теперь работает и без среды Visual Studio или C++Builder – проверяем препроцессированные файлы от чего угодно".
                +26
                да еще и бесплатный… только что кушать разработчикам?
                • UFO just landed and posted this here
                    +3
                    положа руку на сердце скажите, сколько опенсорс проект соберёт средств, если его использование никак извне не видно?
                    • UFO just landed and posted this here
                        +8
                        Во-1х: видно
                        Во-2х: они как раз продают поддержку, не хочешь брать у них — бери любого сисадмина.
                        В-3их: RHEL не опенсорс, у них есть проприетарный кусок.

                        в случае с вышеупомянутым инструментом эта модель не окупится.
                        • UFO just landed and posted this here
                            +15
                            Уважаемый знаток, продай нас, пожалуйста, Гуглу.
                            +2
                            Другими словами, «придумайте там, как взять деньги с кого-нибудь, а мне дайте пожалуйста на халяву».
                    0
                    Можно не опенсорс, можно не бесплатный, но для открытых проектов бесплатно, для маленьких проектов кодеров-одиночек цена в 50-200$ (и не в год, а разовым платежом). Подобная ценовая политика сделала бы PVS-Studio офигенную популярность и не думаю что разорила бы разработчиков. PVS-Studio инструмент конечно классный, но лично для меня и парочки небольших компаний, которые я знаю его как бы вообще нету при такой ценовой политике) Надеюсь опенсорсную библиотеку cpp-парсер они еще поддерживают. Думаю, скоро и ее прикроют.
                    Даже и статьи их читать уже не интересно… просто красивая реклама
                      0
                      Я не знаю, что мне еще нужно сделать… Разработчики маленьких проектов и кодеры-одиночки могут и так использовать PVS-Studio. Имеющихся в триале кликов им для этого хватит.
                        +25
                        Из статьи "Лицензирование PVS-Studio: почему у нас нет Single User License?".
                        Разработка небольшого проекта силами одного-двух человек

                        В данном случае, приобретать инструмент PVS-Studio нет смысла. Не то что бы он вредит или не помогает, просто в малом объеме кода, который пишется 1-2 программистами, c ошибками еще можно бороться вручную. Программист знает весь проект целиком. Нет старого незнакомого унаследованного кода. Нет новых неопытных сотрудников. Нет спешки при разработке.

                        В данном варианте использование статического анализатора выглядит скорее как украшательство, чем как необходимость. Тем более, поскольку проект маленький, для его работы вполне хватит триальной версии PVS-Studio. В ней есть ограничение по количеству переходов. Но можно переходить в нужные места проекта, не используя клики. Это не очень удобно, но поскольку проект маленький, то подобной навигацией можно вполне пользоваться. Также в маленьком проекте будет мало ошибок, а значит, переходить к предупреждениям потребуется не часто.

                        Получается, что в маленьком проекте вполне можно использовать PVS-Studio бесплатно.


                        И ещё. Нам время от времени пишут, что дорого. Вот если бы продукт стоил 200, 400, 500$ то тогда бы ого-го!.. и он бы купил и все купили. Мы одно время провели эксперимент. Всем кто такое писал, предлагали купить PVS-Studio по озвученной ими цене. И что вы думаете? Купила пара человек. Остальные отвалились. Или оказалось, что и 400$ нет, или что не нужно (он на C#) пишет, или что он студент и просто так написал, или что то кризис и начальник денег не дал. Больше мы не слушаем таких советчиков. Кому нужно, тот покупает. Иногда обсуждается скидка, но не цены в 200$. А кому не нужно, тот и за 200$ не купит. Будет писать что дорого, и вот если бы 20$, то тогда ого-го!!!
                          0
                          А вот сейчас посмотрим, как за $250 пойдёт… :)
                          0
                          Прошёл год и Ваша мечта исполнилась. :)
                          Мы выпустили новый статический анализатор кода CppCat. Отличный вариант для кодеров-одиночек. Одна лицензия — $250. Приглашаю скачать и попробовать. Ну и купить тоже. :)
                        +17
                        Звучит как «PVS-Studio наконец то посягнул на святая святых» :)
                          –10
                          Буду кидать ссылку на эту статью программистам, которые стесняются просить делать code review, говоря что они уже не джуниоры.

                          P.S.
                          Скорее всего вы это уже сделали, но всё же спрошу: «А вы эти ошибки сообщили им сюда?
                            +26
                            Вопрос из постскриптума тоже пишут к каждой статье о PVS-Studio. Ну просто к К-А-Ж-Д-О-Й…
                              +2
                              И это хорошо, так как это сподвигает автора добавлять эту информацию . И если это будет добавлено в конец следующей статьи, то таких вопросов сразу не возникнет и будет всё понятно не только тем, кто читает абсолютно все статьи и видел уже много стандартных вопросов и ответов к ним, но и обычным людям, которые просто наткнулись на статью с этого блога впервые. Вы согласны?
                                +4
                                Пробовал. Всё равно спрашивают. :) Да и статья захламляется.
                                  +2
                                  А может просто стоит добавлять в конец статьи ссылки на багрепорты?

                                  Например, мне было бы интересно, что думают об этих ошибках разработчики и как/когда они будут исправлены, а так получается, что информация об ошибках есть, а где искать информацию о процессе их устранения неизвестно (понятно, что скорее всего в баг-трекере или mail-листах, но они большие и искать в них сложно).
                                    +2
                                    Если честно — просто лень и я делать это не буду. Я отписываю про ошибки уже после публикации статей. Собственно, я в баг трекере и даю ссылку на статью. Ходить потом везде и вписывать ссылки не хочется. Тем более, что мое письмо разбивают на десяток отдельных багов и мне надо отслеживать какие новые записи появляются в баг теркере. Мне это не интересно. Плюс, надо помнить, что правильным решением является самостоятельная проверка проекта, а не исправления того, что отписал я.

                                    Можно удовлетворить любопытство так. Подождать недельку после публикации статьи. Затем использовать Google. Например, вводим «chromium pvs-studio» (искать за месяц). И смотрим, что нашлось: 1, 2, 3,…
                                      +3
                                      Специально для интересующихся:

                                      N1: svn.boost.org/trac/boost/ticket/9026
                                      N2: svn.boost.org/trac/boost/ticket/7337 (старая)
                                      N3: svn.boost.org/trac/boost/ticket/9027 (разработчик только что исправил и поблагодарил)
                                      N4: svn.boost.org/trac/boost/ticket/8752 (старая)
                                      N5: svn.boost.org/trac/boost/ticket/9028
                                      N6: не ошибка, перед этим в коде выставляется флаг «кидать исключения при сбоях»
                                      N7: как замечено ниже — не ошибка
                                        0
                                        Ожидаемо. Выводы:
                                        1) Надо запускать PVS-Studio регулярно. Зачем искать и править ошибки, если их можно обнаружить на самом раннем этапе.
                                        2) Я ошибаюсь, принимая корректный код за баг и наоборот. Следует проверять проекты самостоятельно.
                                    +2
                                    Любой школьник может с помощью инструмента PVS-Studio обнаружить эти ошибки и исправить их в бусте. Andrey2008 один, а проектов — десятки тысяч. Не удивительно, что он только подмечает проблемы в известных проектах, а не исправляет их…
                                  0
                                  Насчёт дороговизны поддержки. А как насчёт того, чтобы продавать лицензии подешевле без поддержки?
                                    0
                                    Не взлетает. Вопросы все-равно есть, поддержка все-равно нужна людям. Это по опыту.
                                  +2
                                  Если мне не изменяет в память в одной из последних (триал, само собой) версий видел clang в пакете. Вы перешли на него в плане разбора или остаетесь на своем движке? Какие планы?
                                    +2
                                    Немного о взаимодействии PVS-Studio и Clang
                                    Аннотация. Причина, по которой эта заметка появилась в том, что многие считают, что анализатор PVS-Studio основан на Clang. Это не так. Хотел кратко изложить информацию, о том, почему в составе дистрибутива PVS-Studio находится компилятор Clang и для чего он используется.
                                      +1
                                      Спасибо за ответ, проглядел почему-то эту статью, хотя почитываю вас регулярно. С тех пор решение о переходе на clang не поменялось? В статье достаточно сухо этот момент упомянут, мол, было бы круто, но работает и так. Миграция не окупится, правильно понимаю? Простите, что пристал, просто самому очень понравился libclang.

                                      И да, ребят, вы ахренительные, как с точки зрения подхода к бизнесу (в том числе и маркетингу), так и с точки зрения разработки. Успехов вам.
                                        +1
                                        Не поменялось. Боюсь, что не окупится. Плюс мы тогда не сможем полностью контролировать процесс разработки. Вот выйдет VS2013, мы сядем и сделаем, что они там нового поддержат из C++11 и C99. А с Clang не понятно. Вдруг, они запланируют поддержать VS2013 через пол год или год. Что тогда делать…
                                          0
                                          Дописывать самим и делиться. Шучу от части, понял вас, вполне разумно.
                                            0
                                            А Clang уже поддерживает C++11 и C99, доделывать ничего не нужно.
                                              –1
                                              Толку-то. А как не умел много в заголовочных файлах Visual C++ разбирать, так и не умеет. И не хочет. Упрямится поддерживать многие ms-специфики.
                                                0
                                                Так это вопрос поддержки MS расширений, а не C++11, как написано в комментарии, на который я отвечаю.

                                                > И не хочет. Упрямится поддерживать многие ms-специфики.

                                                Что значит упрямится? Ваши патчи не приняли что ли? (Но вроде бы таких не видел в списке рассылки.) А вот от других разработчиков патчи для поддержки MS расширений видел (например, declspec(property...), квалификаторы модели наследования, uuidof). Кажется, кто-то писал что недавно удалось собрать MFC приложение.
                                                0
                                                Только простейший проект в Visual C++ 2012 им не собрать — не поддерживаются заголовки…
                                              0
                                              И да, ребят, вы ахренительные


                                              Спасибо, такие комментарии всегда приятно читать.

                                              (Коллега ответит про clang)
                                          +3
                                          Вы не думали о реализации анализаторов кода для других языков программирования?
                                            +6
                                            Думали. Решили, что пока не стоит. Си/Си++ живее всех живых. И ошибок, больше чем в других языках. Комфортный язык для анализа.
                                              +12
                                              Есть языки ошибки в программах которых стоят очень больших денег — Verilog / VHDL
                                              Если по дизайну Verilog сделана микросхема ASIC за миллион долларов, а уже потом найдена ошибка, то исправить ее никак нельзя.

                                              Причем типовые ошибки такие же, как в C: типа напишут if(a=b) вместо if(a==b) или что-то в этом роде.
                                              Вот такая есть статья как раз про это Verilog Gotcha.
                                                0
                                                Ну по крайней мере, в мире HDL языков юнит тестирование, а точнее верификация дизайна не просто принята, а является неотъемлемой частью разработки. Но вообще вы конечно же правы. Подобные ошибки могут и имеют место быть.

                                                А еще можно в добавок сказать, что грамматики этих языков в разы проще чем С++. Тут и LR(1) парсер справится на ура. Так что можно всецело сконцентрироваться именно на анализе.
                                                  0
                                                  верификация дизайна не просто принята, а является неотъемлемой частью разработки

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

                                                  А еще можно в добавок сказать, что грамматики этих языков в разы проще чем С++. Тут и LR(1) парсер справится на ура. Так что можно всецело сконцентрироваться именно на анализе.

                                                  Здесь вы очень сильно ошибаетесь. Всё настолько плохо, что существуют компании вроде Verific, которые целиком делают бизнес на разработке, продаже и поддержке компиляторов для HDL.
                                                  Парсинг VHDL — это ад. Парсинг простого Verilog'а полегче, но вот SystemVerilog — это тоже ад.
                                                    0
                                                    Хм. Интересно, какие именно моменты языка вызывают сложности? Базовая грамматика вполне регулярна. Или там свою роковую роль играют вендорские расширения языка?
                                                      +1
                                                      да, в зависимости от средств компиляции SV поддерживается по разному, более того, иногда одни и те же конструкции работают по разному в разных версиях. развивается еще.
                                                        0
                                                        Ясно, спасибо.
                                                  +2
                                                  Я был одним из разработчиков подобного статического анализатора (http://www.aldec.com/en/products/functional_verification/alint).
                                                  Инструментов такого рода хватает (лидер сейчас — Atrenta SpyGlass), но все они стоят немалых денег.

                                                  Могу сказать, что насчёт «типовые ошибки такие же, как в С», вы слегка заблуждаетесь. То есть да, какую-то часть можно так выловить, но для полноценного поиска ошибок необходима хотя бы частичная эмуляция RTL-синтеза — а здесь на одном только опыте написания статических анализаторов далеко не уедешь. Плюс ко всему — неплохо бы быть в теме проектирования ASIC/FPGA и уметь писать на SV и VHDL. Ну и last but not least — на авторов Windows-only инструмента в этой индустрии посмотрели бы, мягко говоря, странно:)
                                                  +1
                                                  Для JavaScript неплохо было бы сделать, так как он популярен, но в нём можно допустить кучу орфографических ошибок (а кроме того, всяких ошибок контекста переменных, отсутствие var'ов и так далее), и многое он наследует от C/C++.
                                                    0
                                                    Так есть уже подобные анализаторы же. Вот например: jsfiddle.net/9vvZ4/1/ ткните там в меню кнопку «JSHint»
                                                      0
                                                      Проверка им стиля кода отбивает всё желание его использовать. Ну ладно ещё разветвления без фигурных скобок (из-за отсутствия скобок можно ошибиться в отступах, классический if if else), но чем ему битовые операторы и ==null не угодили?
                                                        0
                                                        >>> undefined==null
                                                        true
                                                        >>> undefined===null
                                                        false
                                                          0
                                                          Так это превентивные меры всё, как и с фигурными скобками. PVS-Studio ищет такие ошибки, которые уже допущены.
                                                            0
                                                            Статическим анализом это не всегда поймаешь.
                                                          +1
                                                          Настраивается же.
                                                          Но в любом случае, сравнивать jshint/jslint с PVS-Studio несерьезно, конечно.
                                                  +6
                                                  Огромное вам спасибо за нахождение ошибок.

                                                  Вы не могли бы мне скинуть полный отчет по ошибкам в личку (в буст рассылке нет письма об ошибках :( )? Постараемся исправить их до следующего релиза.
                                                    +4
                                                    Ну вообще идея наверное в том, чтобы кто-нибудь купил лицензию :-).
                                                      +2
                                                      Ну вообще лицензию на инструмент, который отловил ошибки в Boost и помог их исправить, будут покупать охотнее
                                                    +8
                                                    Просто мозг человек на совершенен, и мы все допускаем ошибки.
                                                    Так к месту, что и исправлять не стоит :)
                                                      +9
                                                      Фрагмент N4. Классика жанра. SOCKET

                                                      Такая проверка незаконна. Следует сравнивать переменную с константой SOCKET_ERROR. Однако, программисты часто ленятся и пишут «socket < 0» или «socket >= 0».
                                                      В Linux тип SOCKET знаковый и подобная халтурная работа сходит с рук. ...


                                                      Чувствуется Windows-центричный менталитет. :-) В предыдущей статье вы сформулировали ту же мысль более нейтрально.
                                                      Да, для кроссплатформенного кода сравнение с нулём — безусловно ошибка, но слова «незаконный» и «халтурный» всё-таки не совсем подходят, потому что в линуксовых манах (и в POSIX) прямо сказано, что ф-ция возвращает в случае ошибки число -1, а не константу SOCKET_ERROR. Да и нет такой константы вообще ни в Линуксе, ни в стандартах.
                                                        +1
                                                        Наткнулся в файле Winsock.h (из Windows SDK) на следующий фрагмент:
                                                        /*
                                                         * This is used instead of -1, since the
                                                         * SOCKET type is unsigned.
                                                         */
                                                        #define INVALID_SOCKET  (SOCKET)(~0)
                                                        #define SOCKET_ERROR            (-1)
                                                        

                                                        Что бы это значило?
                                                          +1
                                                          unsigned a = x;
                                                          if (a < 0) и if (a == -1) это разные вещи.
                                                            0
                                                            1. Зачем две константы, если они эквивалентны?
                                                            2. В каких случаях может возникнуть необходимость сравнивать беззнаковое целое с отрицательным числом вместо использования положительной константы?
                                                            3. Приведенный вами код выглядит подозрительно, возможно некоторые компиляторы даже генерируют предупреждение. Неужели для сокетов корректно писать «if (socket==-1)»?
                                                              +3
                                                              К кому обращены эти вопросы? :)
                                                                0
                                                                Как всегда, к сообществу Хабра. Хотя, возможно, нужно спрашивать Билла.
                                                                +2
                                                                3. Может быть, но лучше не надо. Во-первых, есть вероятность того, что какая-нибудь гипотетическая ОС присваивает разные коды ошибок сокетам, а во-вторых, -1 — это mov reg, 0xffffffff, а 0 — это xor reg, reg.
                                                              0
                                                              Это значит, что вы невнимательно читаете комментарии.
                                                            • UFO just landed and posted this here
                                                                +1
                                                                Ну меня ещё был пунктик, что использовать SOCKET_ERROR — плохой совет, т.к. не кросс-платформенно. Но я внимательнее посмотрел, и оказалось, что этот файл с ошибкой win_iocp_socket_service.hpp используется только в Windows, так что тут действительно нет оправдания сравнению с нулём.
                                                                0
                                                                (signed SOCKET)(socket) < 0 работало бы?
                                                                Или *((signed SOCKET *)(&socket)) < 0.
                                                                  0
                                                                  «Лишь бы дороги не делать» © не помню откуда :)
                                                                    0
                                                                    а будет сокет со значением 0xF0402471 — иии?
                                                                      0
                                                                      0xf0402471 меньше 0.
                                                                        0
                                                                        вот именно. но сокет — валидный.
                                                                        невалидный это только -1
                                                                          0
                                                                          Значит *((signed SOCKET *)(&socket)) == -1.
                                                                          Или *((unsigned SOCKET *)(&socket)) == ~0.
                                                                            0
                                                                            Правильно. Но никак не <0! А классическая проверка — на <0 и >=0 :)
                                                                • UFO just landed and posted this here
                                                                    –1
                                                                    Естественно больше. Но для начала, попробуйте хотя-бы найти другие 3-4 ошибки.
                                                                    • UFO just landed and posted this here
                                                                        +2
                                                                        Очень хорошо. Я вот тоже отписал о 976 очень подозрительных местах в разных проектах. К сожалению, я не изучил Boost подробнее. Возможно, я просмотрел ещё несколько ошибок, которые были в логе. Но пожалуй, я лучше проверю ещё что-то. :)
                                                                    0
                                                                    Подозреваю, что в последнем фрагменте (вычитание дат) преследуется цель получить не целочисленный ноль, а нулевое значение типа date_duration, и, возможно, вычитание даты из самой себя — наиболее приемлимый путь.
                                                                      0
                                                                      Во фрагменте №7 структура называется identity_element, и его value должно быть 0. Но, так как шаблоны и всё такое, то просто 0 писать нельзя, нужен ноль правильного типа.
                                                                        0
                                                                        Возможно. Поэтому я всегда говорю, что могу быть не прав. И что разработчики должны сами проверять проекты. Мне может не понравится корректный код, и при этом я пропущу другую настоящую ошибку.
                                                                          0
                                                                          Ну ок, и что в такой ситуации делать разработчику?

                                                                          По моему опыту борьбы с анализаторами могу представить следующие варианты:
                                                                          — Исправить «ошибку», например вставив static_cast<date_duration>(0) — а static_cast возьмет и не скомпилируется, и придется делать reinterpret_cast — а с него-то и начнинается самая жесть и капец проекта.
                                                                          — Забить на этот варнинг. — Как и еще на тысячу других «таких же». Посмотришь, потыкаешь в некоторые, и отключишь его совсем.
                                                                          — Выключить варнинг локально комментом или прагмой — Очень сомневаюсь, что такой коммит сможет попасть в буст. Просто потому, что буст это буст, а PVS — ну, он, скажем так, не настолько популярный.
                                                                            0
                                                                            Согласен, идея не проверять и вообще ничего не делать, намного лучше. :)

                                                                            Кто не хочет — ищет сложности и отговорки, кто хочет — ищет пути.
                                                                          0
                                                                          Однако, путь для этого типизированного нуля выбран больно уж странный.
                                                                          При том, что дефолтный конструктор создаёт именно нейтральное значение:
                                                                              explicit date_duration(duration_rep day_count = 0) : base_type(day_count) {}
                                                                          

                                                                          По крайней мере, в бусте 1.51.
                                                                          Может, в следующих версиях буста что-то резко поменялось?

                                                                          Так, на всякий случай: если программист хочет экономить на спичках написать дефолтный конструктор, который НЕ инициализирует объект, и наряду с ним предусмотреть инициализацию нейтральным/сигнальным/терминальным значением, то есть такой приём:

                                                                          class Foo
                                                                          {
                                                                            int x, y, z;
                                                                          public:
                                                                            // типизированный тэг
                                                                            enum zeroinit_t { zeroinit }; // так
                                                                            struct zeroinit {}; // или так
                                                                          
                                                                            Foo() {} // дефолт и экономия процессорного времени
                                                                            Foo(zeroinit_t) : x(0), y(0), z(0) {} // инициализация (причём конструктор можно делать explicit, а можно и не делать - по вкусу)
                                                                          
                                                                            .....
                                                                          };
                                                                          
                                                                          .....
                                                                          Foo f; // не инициализирован
                                                                          Foo g(Foo::zeroinit); // если тэг - перечисление
                                                                          Foo h(Foo::zeroinit()); // если тэг - структура
                                                                          

                                                                        • UFO just landed and posted this here
                                                                          +2
                                                                          Зачем так делаете: http ://www.viva64.com/go.php?url=NNNN? Я привык наводить мышкой на ссылку и решать, кликать или нет.
                                                                          Или вы скидки даете активно кликающим?
                                                                            +3
                                                                            Мы временами запускаем программу. Видим ссылки, которые отвалились. По возможности, находим новое местоположение статей и правим в базе. В результате, мы более-менее стараемся поддерживать все ссылки в наших материалах в адекватном состоянии. Как ни открой статью на стороннем сайте 5-ти летней давности — ни одна ссылка не работает. А мы заботимся о наших читателях.
                                                                              +1
                                                                              Ну, и заодно, собираете статистику для маркетологов.
                                                                                0
                                                                                Вы, наверное, себе целую корпорацию нафантазировали… :) К моему сожалению, это не так.

                                                                                Маркетологов у нас нет. Все по немного занимаются продвижением. Но если хотите, меня можете назвать главным маркетологом. Так как в основном я на внешний мир воздействую и придумываю всякое разное, веду твиттеры и т.п. Кстати, присоединяйтесь к твиттеру. Часто публикую статьи по теме Си++ и прочего.

                                                                                Нет, не собираем. Это у меня бзик на тему битых ссылок. Уж очень иногда раздражает. Я даже статью на эту тему писал "Д'Артаньян и интернет, или работа над проблемой битых ссылок".
                                                                                  +1
                                                                                  Хм, ну раз так, то верю!
                                                                            +1
                                                                            Интересно, много ли было ложных срабатываний? И сколько человеческого времени ушло на поиск описанных багов (учитывая расследование и отсеивание ложных срабатываний).
                                                                              +1
                                                                              Ложных много, но я и никакой настройки не делал. По времени, кажется часа 2, с учётом, что я примеры ошибок выписывал и места, где явно глупые ложные срабатывания и можно улучшить анализатор в дальнейшем.
                                                                            • UFO just landed and posted this here
                                                                                0
                                                                                На Хабре есть наши клиенты, включая клиентов Site-лицензий.

                                                                                Конкретнее по Вашему случаю — во-первых, а зачем Вы смотрите на Site-лицензию, если она для вашей команды не подходит? Может быть Вам вполне будет достаточно обычной лицензии?

                                                                                Во-вторых, посчитайте, сколько тратит компания на одного программиста в месяц? Сравните это с нашей ценой…

                                                                                Мы готовы лично Вам продемонстрировать ценность нашего продукта, напиши мне в почту, я более конкретно опишу.
                                                                                • UFO just landed and posted this here
                                                                                    0
                                                                                    Вы вполне можете начать пользоваться не всей командой. Что касается кряков — то кряки не дают поддержки, а поддержка штука полезная.

                                                                                    У вас есть Visual C++ проекты? Хотите устроим тест-драйв на вашем коде и попробуем найти несколько ошибок?
                                                                                    • UFO just landed and posted this here
                                                                                        +1
                                                                                        возможно в силу какой то совей недальновидности я просто не вижу эффективного и эффектного применения вашей разработке в своем бизнесе.


                                                                                        Обалдеть! Кармак вот видит: 1, 2.

                                                                                        Но он то ерундой занимается…
                                                                                        • UFO just landed and posted this here
                                                                                            0
                                                                                            Клиенты есть уже.
                                                                                            • UFO just landed and posted this here
                                                                                                +2
                                                                                                Надо понимать, что «Microsoft» означает, что какой-то конкретной команде приглянулся инструмент и они купили его себе. Это (к сожалению) не означает, что продана лицензия на весь Microsoft. Такие продажи мы делать пока не умеем. :) Такие продажи делают Coverity и прочие гиганты. В общем-то, в такие компании можно продавать по несколько раз. :)

                                                                                                А какие кампании реально купили и используют а не скачали чтобы посмотреть?

                                                                                                Вопрос не понятен. Это список из тех компаний, которые покупали и были не против, чтобы мы разместили их логотип. Есть ещё компании, которые, по каким-то причинам, не разрешают упоминать их.
                                                                                                +1
                                                                                                А в каком порядке они у вас перечислены? В порядке приобретения лицензий? Не логичнее поместить на первом месте таких узнаваемых гигантов, как Microsoft, Bosh и IDSoftware?
                                                                                                  +1
                                                                                                  В порядке приобретения (вверху последние). Поместить можно, но это будет лукавство. Microsoft, — это ведь не весь Microsoft, а конкретная команда.
                                                                                                0
                                                                                                «комментарий удален...» поздно отписался.
                                                                                          0
                                                                                          Предлагаю посмотреть на наш новый инструмент — CppCat. Это облегчённый статический анализатор кода для Visual C++. Для небольших команд это очень хорошая альтернатива PVS-Studio ценой в $250 за лицензию.
                                                                                        • UFO just landed and posted this here
                                                                                        +6
                                                                                        Да, к сожалению, у нас редко появляются клиенты, пришедшие с Хабра. Однако бывает и такое. В основном, это иностранные компании. Некоторые используют продукт не один год.

                                                                                        А на Хабре зато интересно. Активное общение. Без этого скучно. Где ещё тебя м… ом обзовут, и ты ответить можешь. :) Интересно ведь пообщаться! И иногда попадаются ценные пожелания/советы.

                                                                                        Важную составляющую в цену вносит поддержка. Попробуйте у разработчиков DevPartner/ Bounds Cheсker что-то выпросить изменить. А тут вот мы. Готовы к общению и идеям. И в почте не люди-роботы отвечают, а я и мои коллеги. Мы оперативно готовы что-то кому-то сделать, поправить или сделать спец режим. Люди в восторге от скорости, с которой мы отзываемся и делаем что-то. Возможно, если компания разрастется, мы так не сможем. Но мы будем стараться до последнего сохранить скорость общения и реакции.

                                                                                        В том числе, мы прислушиваемся и к просто дельным советам и пожеланиям. Вот, например фраза из совсем свежей переписки. Надеюсь, человек не обидится за использование :)

                                                                                        … Спасибо за ответы, но честно говоря, немного настораживает такая «оперативность в реализации замечаний в желании угодить клиенту». Я конечно понимаю, правило «клиент всегда прав» и всё такое, но во-первых, мы пока ещё не ваш клиент (и наш директор не охотно соглашается на доп. затраты), а во-вторых,… (дальше к делу не относится) ....
                                                                                        • UFO just landed and posted this here
                                                                                          +1
                                                                                          у меня контора лям+ в месяц рублей зарабатывает

                                                                                          1000'000 белорусских рублей = 112.11 долларов США

                                                                                          :)
                                                                                        • UFO just landed and posted this here
                                                                                            0
                                                                                            Всё просто. Если вы не покупаете — то не покупаете. А если у них перестанут покупать — то они подумают. А раз цена такая — значит она вполне адекватна.
                                                                                            • UFO just landed and posted this here
                                                                                              • UFO just landed and posted this here
                                                                                                • UFO just landed and posted this here
                                                                                                  • UFO just landed and posted this here
                                                                                                +3
                                                                                                Вы не поверите, но в мире в целом воровать не принято.
                                                                                                • UFO just landed and posted this here
                                                                                                  +5
                                                                                                  Да, мы знаем, что существуют кряки и кейгены. Но не боремся с ними. Ну разве что изредка, немного что-то поменяем. Тот кто не готов купить, все равно не купит. Мы не верим в «упущенную выгоду». Плюс такие люди лишают себя сопровождения, ответов на вопросы. А вопросы нам иногда задают ого-го. Ответ может дать только квалифицированный программист.
                                                                                                    0
                                                                                                    Предлагаю посмотреть на наш новый инструмент — CppCat. Это облегчённый статический анализатор кода для Visual C++. Одна лицензия — $250
                                                                                                      0
                                                                                                      У меня столько нет…
                                                                                                        0
                                                                                                        Cкажите, пожалуйста, Ваши инструменты CppCat или PVS-Studio умеют для анализа прозрачно притворяться компилятором cl?
                                                                                                        Чтобы можно было, например, добавить путь к этой обертке в PATH, запустить сборку проекта, а потом почитать готовый отчет?
                                                                                                          0
                                                                                                          Именно в таком виде, к сожалению нет, но мы работаем в этом направлении. Со временем в PVS-Studio что-то такое появится.
                                                                                                            0
                                                                                                            А в CppCat не планируется добавлять такой вид интеграции?
                                                                                                    +2
                                                                                                    По-моему, с такими ценами проще что-нибудь крупное и популярное написать, выпустить и дождаться, пока сами Viva64 проверят.
                                                                                                      0
                                                                                                      Только надо помнить, что толку от такой разовой проверки крайне мало. Смысл статического анализа в регулярности. Вы ведь варнинги компилятора не раз в 3 года включаете, чтобы посмотреть, что и как? (вопрос риторический. можно не отвечать :)
                                                                                                        0
                                                                                                        Так они ещё и ключик на время дают.
                                                                                                          0
                                                                                                          Ну хорошо. Вы ведь включаете варнинги компилятора не раз в 3 года на 2 недели? )
                                                                                                            0
                                                                                                            А я их и не выключаю.
                                                                                                            Ну кроме _CRT_SECURE и C4996, потому что они бесят.
                                                                                                              0
                                                                                                              А теперь попробуйте ещё PVS-Studio к ним добавить.
                                                                                                              • UFO just landed and posted this here
                                                                                                                  0
                                                                                                                  5+
                                                                                                                    +5
                                                                                                                    Можете меня не извинять, но ваши комментарии в этом топики уже поднадоели. Если вас не устраивает цена и качество PVS-Studio, просто проигнорируйте его и не занимайтесь спамом своего мнения.
                                                                                                                    А вообще странно, что вы не смогли оценить всей полезности этого инструмента. На Хабре уже несколько десятков статей, анализирующих ошибки в популярных open-source проектах из различных уголков мира IT, и из геймдева тоже. Некоторые, действительно, являются следствием машинальных действий программистов. Некоторые — более интересны, такие, о которых ранее и не задумывался. И не смотря на то, что PVS-Studio я не использую, потому что нищеброд масштабы проектов не те, эти статьи, хоть они и являются по большому счету рекламными, открывают глаза на вот те ошибки, о существовании которых ранее и не задумывался, и помогают писать код более ответственно и аккуратно.
                                                                                                                    Ну и опять же, то, что вам не нужен PVS-Studio не означает, что он не нужен вообще никому. Возможно, у вас проекты — говно-социалочки под мобилочки с небольшой кодовой базой и временем жизни.
                                                                                                                    • UFO just landed and posted this here
                                                                                                                        0
                                                                                                                        Если больной темой является оптимизация, то тут PVS-Studio не помощник. Это удел динамических анализаторов.

                                                                                                                        Помимо отложенной ошибки, есть ещё опечатки. Они точно есть и их много. Их «тыщи» в свежем коде. Доказательство — их можно найти даже в старом и отлаженном коде. Раз они есть там, то в свежем коде их вообще много. Вот я вроде в курсе, как делать не надо. Но разве меня это защищает? Вот недавно скопипастил:
                                                                                                                        const Ptree *l = SafeSkipParentesis(pParentExpr);
                                                                                                                        const Ptree *r = SafeSkipParentesis(pParentExpr);

                                                                                                                        Хорошо, что PVS-Studio тут же одёрнул: V656 Variables 'l', 'r' are initialized through the call to the same function. It's probably an error or un-optimized code. Consider inspecting the 'SafeSkipParentesis(pParentExpr)' expression. Check lines: 345, 346. functionselector.cpp 346
                                                                                                                        Должно было быть:
                                                                                                                        const Ptree *l = SafeSkipParentesis(First(pParentExpr));
                                                                                                                        const Ptree *r = SafeSkipParentesis(Third(pParentExpr));

                                                                                                                        Я бы сидел потом тупил, почему работает не так как задумано. Зачем тратить время на такие глупые ошибки? Я лучше над более сложными ошибками и алгоритмами подумаю.

                                                                                                                        А ещё, например, анализатор подсказывает о том, о чём человек может вообще не догадываться. Одной из таких диагностик является V597. Примеры.
                                                                                                                          +1
                                                                                                                          может быть экспириенс не прокачен?

                                                                                                                          Не исключено.

                                                                                                                          лично мне фантзия не подсказывает пример программерской ошибки в коде которая не проявит себя синтаксически или логически в момент тестирования продукта

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

                                                                                                                          Если вы о юнит-тестировании, то эти тесты пишутся теми же программистами, которые эти ошибки и совершают. В написании тестов тоже можно накосячить, не говоря уже о том, что качественно писать тесты с максимальным покрытием тоже нужно уметь.

                                                                                                                          Да и не нужно тут полагаться на свою фантазию: откройте блог PVS-Studio и просмотрите их статьи. Там детально и структурированно описано множество ошибок, некоторые из которых совершены программистами с весьма обширным опытом.

                                                                                                                          а если ошибка никак не проявляется себя — то может быть и нет смысла тратить 9к чтобы ее найти?

                                                                                                                          Во-первых, да, может быть и не стоит. Цена ошибки у каждого продукта своя.
                                                                                                                          Во-вторых, то, что ошибка себя не проявляет в конкретный момент времени, еще не означает, что ее нет. Закон Мерфи всегда готов о себе напомнить.
                                                                                                            0
                                                                                                            Теперь ждать не надо! Предлагаю посмотреть на наш новый инструмент — CppCat. Это облегчённый статический анализатор кода для Visual C++. Для небольших команд это очень хорошая альтернатива PVS-Studio. Цена: $250 за лицензию.
                                                                                                            –2
                                                                                                            В статье все так красиво написно(как и в других статьях про PVS-Studio)… берем инструмент запускаем на boost(или любом другом проекте), и получаем 5-10 мест с ошибками/опечатками… но это наверняка не правда.

                                                                                                            Последний раз когда я брал в руки этот инструмент(было давно), это выглядело примерно так:
                                                                                                            Ставим PVS-Studio, запускам студию с большим проектом… все висит… ждем, запускаем анализ… много ждем… получает 100500 сообщений… счастье не наступило… :(… (кстати после этого я студию переставлял — PVS-Studio и студия что то не поделили ...)

                                                                                                            А не могли бы вы сделать видео вместо статьи?
                                                                                                            По типу: тут мы ставим PVS-Studio, тут запускаем анализ на очень большом проекте X, вот все быстро отработало, вот мы отключили ложные срабатывания, а вот наши ошибки… profit!!!
                                                                                                            +1
                                                                                                            Кстати, отзыв от команды МТА. Выдали им на недельку ключ, чтобы проект внимательней проверить. Обсуждаем возможность предоставить им версию на постоянной основе в обмен на ссылку на сайте.
                                                                                                              0
                                                                                                              Пердлагаю проверить ваши продуктом это.
                                                                                                              narod.ru/disk/45533488001.b71b2fe6e6acfd2682b674d3a2f6ae67/main.cpp (беременным, яросным адептам идеального форматирования и просто брезгливым лучше не смотреть)

                                                                                                              Вообще у меня пара вопросов — я тут проверил ваши продуктом пару своих хобби проектов, стало интересно — чем плоха индексация массива типом отличным от size_t? Компиляторы по моим опытам на этом практически никогда не спотыкаются.
                                                                                                                0
                                                                                                                Вы лучше сами скачайте триал и проверьте.
                                                                                                                  0
                                                                                                                  Прошу сделать из этого проект, компилируемый (можно без линковки) в VS2005-2012. С непонятным огрызком возиться не хочется.

                                                                                                                  Про size_t. Если много памяти не выделяете, то почти всегда ничем. А если массив может стать более UINT_MAX, здесь начинаются разные нюансы.

                                                                                                                  1) На таких объемах начинается сказываться скорость работы с массивом. См. пример из статьи "Что такое size_t и ptrdiff_t" (см. раздел «Быстродействие кода, использующего типы ptrdiff_t и size_t»). А вот тут пример с числами (см. раздел «Использование правильных типов данных с точки зрения 64-битных технологий»).

                                                                                                                  2) Банально int не подходит для индексации больших массивов. При этот, что забавно, иногда из-за оптимизации, может казаться, что код работает. Описание такого поведения есть здесь: "64-битный конь, который умеет считать".

                                                                                                                  3) Начинаются различные ошибки переполнения. На эту тему можно почитать:
                                                                                                                  1. Урок 13. Паттерн 5. Адресная арифметика.
                                                                                                                  2. Урок 17. Паттерн 9. Смешанная арифметика.

                                                                                                                    +1
                                                                                                                    прочитал раза три как «смешная» арифметика…
                                                                                                                  0
                                                                                                                  Подскажите пожалуйста, а у вас есть какая-то интеграция с CI, в частности интересует Jenkins?
                                                                                                                  0
                                                                                                                  Каждый раз, когда читаю статьи про PVS-Studio, очень рад, что это земляки из Тулы. :o)

                                                                                                                  Ребята вы молодцы!

                                                                                                                Only users with full accounts can post comments. Log in, please.