Облачный аудит кода Coverity Scan
Как известно, компания Coverity предлагает бесплатно всем open-source разработчикам свой облачный сервис сканирования кода Coverity Scan
Однако, отзывы блогеров пока не очень радужные: сервис выдаёт большое число false positives, в т.ч. и на таких стандартных библиотеках как STL, в частности описывают следующий результат сканирования libraw:
107 предупреждений, из них где-то треть — с High Impact.
Из High Impact:
- Штук 10 в Microsoft STL (сабмитили виндовую сборку)
- Еще какое-то количество такого примерно вида:
-
int variable;
-
if(layout==Layout1) variable=value1;
-
if(layout==Layout2) variable=value2;
И на это дается предупреждение, дескать неаккуратненько, не инициализированная переменная. С этим можно согласиться по общим ощущениям, так не надо делать. Но в реальной жизни бывает два вида layout — и это явно прописано в вызывающем коде. Т.е. у машинки достаточно данных, чтобы сообразить, что это не ‘High impact’, а просто неаккуратность.
-
- Некоторое количество предупреждений, дескать unsigned short при расширении до 32-64 бит может больно укусить. С этим я не хочу спорить — формально машинка права, а по факту в этих unsigned short живут размеры картинки и до 32767 они в ближайшие годы не дорастут.Т.е. опять, фиксить не надо — в случае данной предметной области.
- Все остальные найденные ‘High Impact’ проблемы — это просто ложные срабатывания. Т.е. код, согласен, не идеальный (видели бы вы этот код из dcraw !), но все найденное — не является ошибкой.В частности, любимый коффиновский метод проверки диапазона значений 0..N одним действием машинка просто не чует:
-
int var=-1;
-
if(bla-bla) { var = some_non_negative_value; }
-
if( (unsigned)var < 5) // => это проверяет на диапазон 0..4
-
Источник:
http://blog.lexa.ru/2013/02/16/pro_staticheskii_analiz_s.html
Базовый рисерч показывает, что с реализацией stl у MS всегда были проблемы.
http://stackoverflow.com/questions/14647007/does-stdlistclear-invalidate-stdlistend-iterator VS2012
http://www.rsdn.ru/forum/cpp/55878.1 — VC6
http://msdn.microsoft.com/en-us/library/vstudio/ecdecxh1(v=vs.100).aspx VS2010
The last time I checked, Microsoft’s std::sort was implemented in a way
that has O(n*n) worse case run time when sorting containers with lots of
equivalent elements. According to Sedgewick, this is simply a bug in
the most common partition implementation (
http://www.cs.princeton.edu/~rs/talks/QuicksortIsOptimal.pdf ) and is entirely
avoidable. The C++ Standard warns that std::sort can have a bad worse
case run time, but it doesn’t actually require it.
Забавно. с учётом того, что компилятор у них — первоклассный в плане оптимизации (а вот препроцессор — уже нет).
По-моему, у Microsoft просто сильно скачет уровень по различным командам девелоперов.
Вообще куцые куски кода приводятся. Очень похоже на то, что ребята заставляют статический анализатор проблему остановки решать.
http://ru.wikipedia.org/wiki/%CF%F0%EE%E1%EB%E5%EC%E0_%EE%F1%F2%E0%ED%EE%E2%EA%E8
На вики можно ссылку не приводить.
Я обычно на лекциях это называю проблему «останова», так ее переводят в ряде изданий.
Очевидно, что в эту проблему рано или поздно упирается любой статический анализатор (см. Теорему Райса), когда начинает строить достаточно подробную модель программы.
Так или иначе приходится упрощать или апроксимировать (если конечно не хотим в конечном счете построить интерпретатор программы 🙂 ) так что в любом случае это вопрос — к разработчикам анализатора, а не к дураку-пользователю, что не тот код суёт 🙂