LINUX.ORG.RU

Команда PVS-Studio: Свежий взгляд на код Oracle VM VirtualBox

 , , ,


1

5

Использовать свои любимые дистрибутивы Linux в VirtualBox со временем становится затруднительно. В этом на своём опыте убедился Святослав Размыслов из команды PVS-Studio, который опубликовал статью о проверке Oracle VM VirtualBox. По его мнению, с VirtualBox 5.0.XX, стабильность работы программы заметно ухудшилась.

Но вернемся к сути статьи. Мы уже встречались на сайте с работой Святослава и активно её обсуждали. Думаю, есть повод для новой дискуссии о качестве открытых проектов.

Напомню, что разработчики PVS-Studio славятся тем, что в целях рекламы своего продукта регулярно проверяют различные открытые проекты.

Это не первая статья о проверке исходного кода виртуальной машины. Почти два года назад в коде VirtualBox было найдено более 50 ошибок и их описание было опубликовано двумя статьями (1, 2). К счастью, все те предупреждения анализатора разработчики исправили, но качество исходного кода постоянно ухудшается. О чём говорит снижение стабильности последних версий программы и несколько десятков новых ошибок, найденных с помощью PVS-Studio.

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

>>> Подробности



Проверено: tailgunner ()
Последнее исправление: tailgunner (всего исправлений: 3)
Ответ на: комментарий от SZT

Сами проверки может и несут какую-то пользу, а вот насчет именно пиара - сомневаюсь

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

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

То, что вы не умеете понимать написанное не проблема разработчиков.

Ага, там русским по белому написано, что польза от единичной проверки очень мала, а я значит этого не понял.

Это сугубо тыканье вас в ваши же слова, не более.

Пока только говорите, что тыкали. Реально тыкал вас я.

x86_64 ★★★
()
Последнее исправление: x86_64 (всего исправлений: 1)
Ответ на: комментарий от andreyu

Вы не умеете ни в чужие мысли, ни в свои. Это печально.

В отличии от вас я не изображаю из себя телепата.

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

x86_64 ★★★
()
Последнее исправление: x86_64 (всего исправлений: 1)
Ответ на: комментарий от x86_64

Ага, там русским по белому написано, что польза от единичной проверки очень мала, а я значит этого не понял.

Вы даже не понял, что я вам написал на этот счет.

Пока только говорите, что тыкали. Реально тыкал вас я.

Ок, диплом ваш.

andreyu ★★★★★
()
Ответ на: комментарий от x86_64

Вы не умеете ни в чужие мысли, ни в свои. Это печально.

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

Достаточно просто не быть дауном.

В отличии от вас я не изображаю из себя телепата.

Не нужно быть телепатом, что бы научиться читать.

andreyu ★★★★★
()
Ответ на: комментарий от anonymous

x86_64, andreyu когда будете просить друг друга сходить к доктору?

Ну, он уже готов. Закипел. Вон на личности перешел.

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

Развалинами удовлетворен. :)

x86_64 ★★★
()
Последнее исправление: x86_64 (всего исправлений: 3)
Ответ на: комментарий от EtherealPhantom

Я знаю, что они запросто могли бы сделать, даже если и не должны.

А они так и говорят - «можем, но нам это не выгодно». Почему вы решили, что они что-либо должны вам или кому-либо еще?

andreyu ★★★★★
()

Почему бы вам не попробовать сделать сервис по подписке? По типу Coverity Scan, но платный, с webui и прочими наворотами. И интеграцией с Travis-CI/AppVeyor.

А тем, кто хочет открытый продукт - рекомендую взглянуть на Infer https://github.com/facebook/infer

XVilka ★★★★★
()
Ответ на: комментарий от XVilka

Почему бы вам не попробовать сделать сервис по подписке?

Это дорого, сложно и непонятная область. Мы ещё пока в самом начале освоения рынка Visual Studio.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от Andrey_Karpov_2009

По-моему, как раз наоборот - web-разработчика просто найти, по сути только вывод утилиты вашей распарсить и всё.

XVilka ★★★★★
()
Ответ на: комментарий от andreyu

Это не я приперся на ЛОР орать о своем платном продукте который никто из местных не сможет купить. И даже не по причине отсутствия денег. А просто потому что «нэ продается».

Edible
()
Ответ на: комментарий от Edible

Ну мне достаточно, если virtualbox станет чуточку лучше.

Интересно, сохранение скриншотов с путем из неанглоязычных буковок починили?

fornlr ★★★★★
()
Последнее исправление: fornlr (всего исправлений: 1)
Ответ на: комментарий от fornlr

Они сами же говорят что от единичной проверки толку нет.

Edible
()
Ответ на: комментарий от anonymous

После шланга и CppCheck, увы, назодит только ложные ошибки.

Не верю. Или проект слишком мал и там само по себе мало ошибок.

Раз ошибки, например, находятся в Clang, значит он их найти не может: http://www.viva64.com/en/b/0108/ , http://www.viva64.com/en/b/0155/

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от Andrey_Karpov_2009

Andrey_Karpov_2009, от вас нужно только одно, официальная версия для Linux и официальная стоимость. Все типы сборочных систем поддерживать не нужно. Достаточно реализовать поддержку, например, cmake, как это сделала IntelliJ в clion. А пока на текущий момент наблюдается явная недружественность к ОС Linux как в стратегии развития вашего продукта, так и в заявлениях руководства, то есть Вас лично.

Displacer ★★
()
Ответ на: комментарий от Andrey_Karpov_2009

К сожалению, это вновь теория, которая никак не согласуется с действительностью. Я вынужден разрушить розовый мир. У каждого компилятора «свой стандарт С++». Просто оно вот так и всё. Свои заморочки, свои расширения, свои несовместимости. Поэтому с каждым конкретным компилятором надо заниматься отдельно. Это очень большая, скрытая от других работа.

Существует такая вещь, как международные стандарт ISO, как по C, так и по C++, вот и проверяйте код в рамках стандарта. Стандарт одинаков для всех компиляторов. По расширениям печатайте предупреждения, которые те, кто знают, что делают, могут отключить.

Displacer ★★
()
Ответ на: комментарий от Deleted

я офигеваю с людей

Что, официальная, а не «кастомная» кустарная версия - это такое грандиозное пожелание? Или наоборот, надо требовать как тут многие какого-то абсурда в ввиде раскрытия исходных текстов или бесплатного софта?

Displacer ★★
()
Ответ на: комментарий от Displacer

Ну нет у них рынка сбыта этого, нет. Я сталкивался с таким. Сделать проприетарную «коробку» - это же жесть какие ресурсы нужны, хотя бы на тестирование. А профит сомнителен, т.к. клиентов и нет. Нам в свое время сказали: «нужен centos 5» - запилили rpmки, тестировали на всех выходящих релизах. Потом сказали «нужен centos 6» - погнали, теперь у нас две ветки тестирования.

Я представляю работу нашего отдела (а мы были не мейнтейнерами и внедренцами, мы были разработчиками, которым сказали сделать «инсталлятор») и масштаб расширения штата, если бы понадобилась поддержка еще пары дистрибутивов. Понятно, речь шла бы уже о расширении, и если бы с каждым поддерживаемым дистрибутивом линукс мы получали, скажем, дополнительных 100 клиентов, это было бы осуществлено. Но мы по-простому делали эдакую коробку под centos5-6, почти кастом, для наших N клиентов. Мы же не nvidiа, которые могут себе позволить 1000 индусов отрядить на постоянное тестирование.

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

В этом смысле, свободная лицензия сыграла бы, но сам понимаешь, нюансы есть :)

Deleted
()
Ответ на: комментарий от Deleted

А зачем куча дистрибутивов? Достаточно к примеру убунты LTS. На всём остальном и так будет работать с вероятностью 90%. Сомневаюсь, что там из зависимостей что-то сильно более тяжелое, чем libc и libstdc++.

PS: припоминаю, что сами разработчики как-то хвалились, что им проще завелосипедить свою функцию, чем подключать стороннюю библиотеку. И мало того, что хвалились, так еще на полном серьезе всем это советовали :)

Displacer ★★
()
Последнее исправление: Displacer (всего исправлений: 1)
Ответ на: комментарий от Andrey_Karpov_2009

А станете ли вы своей программой проверять исходники другого статического анализатора, нацеленного на C, C++? А то вот «создавать потенциально бесплатного конкурента» вы не хотите, а анализировать код потенциально бесплатных конкурентов вы хоть не против? У вас есть такие правила «не проверять открытые статические анализаторы, чтобы не помогать конкурентам»?

SZT ★★★★★
()
Ответ на: комментарий от Displacer

Существует такая вещь, как международные стандарт ISO, как по C, так и по C++, вот и проверяйте код в рамках стандарта.

Программисты умные люди, но думать иногда не хотят. :) Какая анализатору разница, есть стандарт или нет. Есть код, данный нам в ощущение. А там, в заголовочном файле <vector> кто-то взял и написал inline функцию вида:

inline int Foo(int b) { return b ?: 42; }

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

И поверьте, всяких таких разных штук тьма тьмущая. Поглядите хотя-бы во что простая функция strcmp может разворачиваться. Ну ка расскажите мне, что стандарт нам повествует про __builtin_constant_p, __builtin_strcmp, __extension__ и т.д. А ведь это всё вылезло только из простой strcmp!

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от andreyu

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

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

SZT ★★★★★
()
Ответ на: комментарий от SZT

А станете ли вы своей программой проверять исходники другого статического анализатора, нацеленного на C, C++?

Да ради бога: http://www.viva64.com/ru/b/0108/ , http://www.viva64.com/ru/b/0155/

Больше ничего открытого и достойного внимания не попадалась. Есть ещё конечно Cppcheck. Но в нём ничего интересного не находится. Насколько я помню, мы давали автору ключ на PVS-Studio. Поэтому, наверное, ничего и нет. Ну или он ооочень аккурантый. :)

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от SZT

Еще раз. Сам пиар открытым продуктам пользы никакой не приносит, пользу приносит только сама проверка.

Проверка проведена, отчет отправлен разработчикам. Какие еще у вас претензии?

Например Coverity помогает опенсорсным проектам без всякого надоедливого пиара.

А баба Клава на лавке семечки грызет. Только кому есть до этого дело?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Претензии в том, что из этого не надо делать событие мирового масштаба, о котором надо писать новость на хабр и ЛОР. Проверка очередного октрытого проекта это не повод для пиара. Это примерно как если б я например написал какой-нибудь коммерческий компилятор для языка Си, и начал бы им все опенсорсные проекты компилировать, спамя ЛОР и хабр новостями, какой у меня крутой компилятор, и как он тут вот хорошо векторизовал, и что вот тут у нас программа на 20 секунд быстрее работает собранная моим компилятором. Просто зачем столько новостей об этом?

SZT ★★★★★
()
Ответ на: комментарий от SZT

Претензии в том, что из этого не надо делать событие мирового масштаба,

Событие мирового масштаба родилось у вас в голове.

о котором надо писать новость на хабр и ЛОР.

Точно, тут нужно писать про «смотрите, я поставил убунту» и «я люблю пони».

Проверка очередного октрытого проекта это не повод для пиара.

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

Это примерно как если б я например написал какой-нибудь коммерческий компилятор для языка Си, и начал бы им все опенсорсные проекты компилировать, спамя ЛОР и хабр новостями, какой у меня крутой компилятор, и как он тут вот хорошо векторизовал, и что вот тут у нас программа на 20 секунд быстрее работает собранная моим компилятором.

Когда напишите, тогда и поговорим.

Просто зачем столько новостей об этом?

Сколько?

Сказку про дурака, который ничего не делал, а ходил раздавал советы знаете? Кого вам напоминает тот дурак?

andreyu ★★★★★
()
Ответ на: комментарий от SZT

и что вот тут у нас программа на 20 секунд быстрее работает собранная моим компилятором.

А я бы почитал... так что напиши.

DarkEld3r ★★★★★
()
Ответ на: комментарий от andreyu

Событие мирового масштаба родилось у вас в голове.

https://ru.wikipedia.org/wiki/Гипербола_(риторика)

Точно, тут нужно писать про «смотрите, я поставил убунту» и «я люблю пони».

Новости про это писать точно не стоит.

Что является поводом для пиара решают разработчики. Ваше мнение они спросят когда посчитают нужным.

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

А то, что они проверили открытый продукт и отправили отчет разработчикам этого продукта очень хорошо.

Конечно хорошо, с этим я не спорю и пишу сейчас совершенно серьезно — хорошо что они отправляют ошибки разработчикам. Но я не считаю, что подобные проверки является достаточным основанием, чтобы об этом писать целую новость. Это мое личное мнение.

Когда напишите, тогда и поговорим.

Сперва добейся

Сколько?

www.linux.org.ru/people/Andrey_Karpov_2009/?section=1 — три.

Сказку про дурака, который ничего не делал, а ходил раздавал советы знаете? Кого вам напоминает тот дурак?

Давайте обойдемся без переходов на личности. «Ничего не делал» это явно не про меня

SZT ★★★★★
()
Ответ на: комментарий от Andrey_Karpov_2009

Мне кажется вы немного хитрите, недоговариваете. Если у вас уже есть кастомная версия, то как минимум некоторые такие вопросы были вами уже решены. А я подозреваю, что большинство. Если же нет, можно снижать цену пропорционально отсуствующей функциональности. Да и компиляторов всего немного и то друг с другом пытаются поддерживать совместимость, точнее с gcc. Как компилятор интела, так и llvm с clang-ом. У меня сложилось мнение, что всё-таки позиция по linux у вас не из-за технических сложностей, тут что-то другое.

Displacer ★★
()
Ответ на: комментарий от Displacer

У меня сложилось мнение, что всё-таки позиция по linux у вас не из-за технических сложностей, тут что-то другое.

Мы всегда и говорим, что основная сложность не техническая, а маркетинговая. Сложно продавать. А мы ещё слишком слабы, чтобы рисковать. Для начала лучше C#.

Andrey_Karpov_2009
() автор топика

Ждем иск Оракла к PVS на сотни нефти :)

slackwarrior ★★★★★
()
Ответ на: комментарий от Andrey_Karpov_2009

А мы ещё слишком слабы, чтобы рисковать.

В чем риск? Продукт продается as is. Начать можно с ограниченной функциональности и дорабатывать. Для linux достаточно консольной версии, интеграция в IDE тут мало кого волнует, людям важна суть вещей.

А с текущей ситуацией люди же видят, что Вы говорите, что делаете. Что нет и не планируется, что мы linux не любим исторически и так далее. И кому надо в такое влезать? Вы же сами убиваете свой потенциальный рынок. Уж лучше говорить было бы, что linux обязательно сделаем, но может не сразу а чуть позже, но точно сделаем. Тогда бы может и эту вашу кастомную версию бы брали с большим желанием с идеей поддержать разработку, показать что спрос есть.

PS: а так эти кастомные версии вызывают ощущение, что тебя хотят под надуманным предлогом ободрать как липку, что я думаю недалеко от реальности, типа «эксклюзив только для вас».

Displacer ★★
()
Последнее исправление: Displacer (всего исправлений: 1)
Ответ на: комментарий от andreyu

Точно, тут нужно писать про «я люблю пони».

как будто это что-то плохое

anonymous
()

Согласно современным стандартам языка C и C++, сдвиг отрицательного числа приводит к неопределённому поведению.

Пожалуйста, ознакомьте своих сотрудников с пунктами 5.8.2 и 5.8.3 стандарта С++.

vzzo ★★★
()
Ответ на: комментарий от vzzo

хмм, ну в одном случае там написано «behavior is undefined», в другом «resulting value is implementation-defined» если смотреть тут http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf

Разница между «undefined» и «implementation-defined» конечно же есть, но я б не советовал полагаться на какое-либо «implementation-defined» поведение конкретного комплиятора

https://stackoverflow.com/questions/2397984/undefined-unspecified-and-impleme...

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT

хмм, ну в одном случае там написано «behavior is undefined», в другом «resulting value is implementation-defined» если смотреть тут

Это всё про сдвиг вправо (но implementation-defined это на порядок меньшая проблема, чем undefined, которая, например, никогда не приведёт к выкидыванию кода оптимизатором и т.д., при чём на всех разумных платформах, где запускается VBox, этот сдвиг будет работать одинаково, выдвигая старший бит). А в примере был сдвиг влево, который абсолютно однозначно определён.

vzzo ★★★
()
Ответ на: комментарий от vzzo

И что-же там такое сказано, чего мы не знаем? Я, кстати, статью на эту тему писал: https://habrahabr.ru/company/pvs-studio/blog/141880/

Ну разве что, не совсем точно написано. Может быть не только UB, а как вариант implementation-defined.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от vzzo

А в примере был сдвиг влево, который абсолютно однозначно определён.

Значение E1 << E2 представляет собой E1 со сдвигом влево на E2 позиций битов; освобожденные биты заполняются нулями.Если E1 имеет тип без знака, значение результата будет равно E1 × 2^E2, уменьшенное на остаток от деления значения, на единицу превышающего максимальное значение, которое можно представить в типе результата. В противном случае если E1 имеет тип со знаком и не отрицательное значение, а E1 × 2^E2 можно представить в соответствующем типе без знака типа результата, это значение, преобразованное в тип результата, будет значением результата; в противном случае поведение не определено.

Andrey_Karpov_2009
() автор топика
Ответ на: комментарий от Andrey_Karpov_2009

Вот кстати, по поводу сдвигов. У вас есть такая диагностика http://www.viva64.com/ru/examples/V3001/ которая определяет одинаковые проверки в условиях. Но можете ли вы обнаруживать одинаковые проверки, записанные разным образом? Например одну и ту же проверку можно записать сдвигом и через остаток от деления:

int test(unsigned int a)
{
  if (  ((a >> 1) << 1) == 12 || (a - (a % 2)) == 12 )
  {
    return 1;
  }
  return 0;
}
Ваша PVS-studio это может обнаружить как V3001? Слышали ли вы про Frama-C, автоматические доказательства корректности, вот это все? Есть ли у вас нечто подобное?

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 3)
Ответ на: комментарий от SZT

Я думаю Вы ошиблись ссылкой. Это примеры работы диагностики для C#. Если речь идёт про C++, то правильнее будет смотреть сюда: http://www.viva64.com/ru/examples/V501/

Там намного больше интересных примеров, так как С++ диагностика намного старше её нового C#- аналога.

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

if (dbv.ptszVal != NULL && dbv.ptszVal != '\0')

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

А раз кто-то что-то такое написал, то лучше всё равно не ругаться, так как очень сложно угадать замысел творца.

Вообще задача и достоинство анализатора, это не в том какие предупреждения он выдаёт, а в том, какие не выдаёт. Я рассказывал как раз про это на последней конференции.

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

if (a == 1 + 5 || a == 7 - 1)

Хотя выражения записаны по-разному, переменная 'a' сравнивается с 6 два раза и это подозриельно.

А вот здесь, анализатор будет молчать:

if (a & (1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0))

Он понимает, что это типовой паттерн записи числа в двоичном виде. И поэтому нет смысла ругаться на: 0 << 5 | 0 << 3, хотя слева и справа от | стоят выражения равные 0. В других случаях это было-бы подощрительно, а так нет.

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

Про Frama-C мы слушали. Но это немного другое. Бесплатных обедов не бывает. Что-бы добиться от него какого-то интересного результата (причем только для С), нужно потратить очень много времени на разметку кода. Это просто не работает, на больших проектах: нельзя просто взять и начать использовать Frama-C. А вот PVS-Studio можно. Мы берём PVS-Studio и можно сразу заниматься поиском и правкой ошибок для C, C++ и C#.

Andrey_Karpov_2009
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.