LINUX.ORG.RU

Диагностики GCC — это хорошо, но недостаточно

 , , , ,


0

7

С++ компилятор, реализованный в GCC, умеет выполнять множество полезных диагностик. Эти диагностики весьма хороши, и многие считают, что их более чем достаточно. В том числе я нередко слышу, что анализатор PVS-Studio не нужен, так как все те же диагностики имеются у GCC. Конечно, я знаю, что это не так. Это то же самое как сравнивать бесплатный Paint.NET с платным Photoshop. Вроде одно и то же, и функции общие есть. Но платный профессиональный Photoshop всегда будет мощнее, чем такие инструменты как Paint.NET.

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

Проверка GCC была ответственным испытанием для бета-версии PVS-Studio for Linux. Это и новая операционная система, это огромное количество макросов, это и код, который уже проверен многими инструментами, и найти в котором хоть что-то непростая задача.

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

Находим ошибки в коде компилятора GCC с помощью анализатора PVS-Studio

Перемещено Aceler из proprietary

Ответ на: комментарий от eao197

Ну, адекватность этого господина для меня лично под вопросом. Да и если заглянуть в код самой PVS-Studio, то, вероятно, говнокода там будет порядком. Как минимум, очень многое у них было гвоздями прибито под Win32 API, раз уж выпуск версии под Linux занял так много времени.

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

Но нам надо думать не только о бессмысленной сборке, но и том, что скомпилировать проект под Linux != сделать продукт под Linux. Плюс надо рассчитывать не протянуть ноги по пути в радостный розовый мир Linux-систем. Программистам надо платить зарплату, причем регулярно и много. Эх везунчики... Могут рассуждать в терминах «многое у них было гвоздями прибито под Win32 API». А тут приходится заниматься тем, что в налоговой не сошлась в налогах 1 копейка (серьезно, 1 копейка где-то не так округлилась) и они готовы карать за это злостное правонарушение. Или мастер, который делает для нас в офисном здании для нас ремонт в новой комнате, вдруг запил. А у нас через несколько дней новеньких посадить будет некуда. Вот они сложности. Win32 API... Эх... Молодежь... :)

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

Andrey_Karpov_2009 например не хочет отдельно продавать анализатор для C по меньшей стоимости, хотя вот мне совершенно очевидно, что на поддержку диагностик только для C тратится существенно меньше время, и львинная доля времени идет именно на все эти нововведения плюсов. Си же меняется со временем довольно незначительно. Так почему те, кто хочет только анализировать чистый Си, должны платить еще и за бесполезный для них анализатор C++ и C#? (или может быть они хотя бы C# анализатор продают отдельно? Хотелось бы надеяться)

Мы позиционируемся так. Есть анализатор PVS-Studio. Он постепенно учится поддерживать другие языки, но стоит при этом одну цену. Вот смотрите, был, например, C/C++ анализатор и стоил он 1000 условных единиц. Теперь он научился дополнительно проверять C#. И по-прежнему он стоит 1000 условных единиц. Если человек хочет только С/С++ это не значит, что мы должны теперь продавать ему эту часть за 500. Это как-то глупо. Но при этом не хотим повышать общую цену до 2000. Мы просто по-прежнему продаем анализатор, который научился большему, за туже условную цену 1000. Так нам проще описывать ценовую политику и делать прайс.

Можно сказать, что мы наоборот только сделали бонус и скидку тому, кто использует одновременно анализатор и для C/C++ и для C#. Ему повезло.

P.S. Всё что я здесь сказал есть не более чем отражение текущей ситуации и в дальнейшем ценовая политика может меняться. Не хочу, чтобы через пять лет кто-то ссылался на эти слова. :) Всё течёт, всё меняется.

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

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

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

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

А впрочем, все равно меня мало кто услышит и поймёт....

Уходя из института высоких температур, ты тоже самое говорил, наверное? Или денежек получить по-быстрому не получилось там? Карпов, почему ты считаешь, что программист не может быть владельцем своего предприятия в одном лице? Зачем ты пытаешься умничать и ставить себя выше других людей тут? Кандидатскую степень ты получил, а писать по-русски грамотно не научился? Это как так получилось? Деньги только считал?

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

Еще лучше — сделать статический анализатор для Java

Хм. А идея, похоже, нашла отклик в душе Андрея:

https://news.ycombinator.com/item?id=12416160

There are two perspective areas: Objective-C and Java.

Andrey_Karpov_2009, а вы, кстати, не экспериментировали со статическими проверками с помощью предикатов в коде? Кто-то вообще (из статических анализаторов) так делает? Ну, что-то типа такого:

/* предикаты в специальном формате комментариев например, чтоб ничего не ломать */

/*!!STATIC_ASSERT ((x >= 0) && (y > DBL_EPSILON))*/
/* если в этой точке предикат может быть ложен при каких-то исходных
данных, даем предупреждение и показываем что-нибудь
(ветки исполнения в которых предикат ложен?) */
z = sqrt(x) / y;

/* или вот так */
str = malloc(N);
/*!!STATIC_ASSERT ((str != NULL) && (idx < N)) */
/*!!REQUIRE (free(str)) */
idx = rand() % N*2;

/* вот здесь можно повозмущаться что нет проверки
str и idx может быть больше N */
c = str[idx];

Теоретически это же можно сделать? В опен сорц анализаторах такого не видел. Может так не делают по каким-то неочевидным причинам?

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

Frama-C

Судя по документации самое близкое это http://frama-c.com/value.html . Он умеет только показывать возможные значения переменных. Не совсем же то? Нужно еще постпроцессить.

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

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

Нет, там это как раз можно. Вот например такое, тут просто проветяем, что функция всегда возвращает 1 (т.е. каст из числа из uint64_t в uint8_t равен остатку от деления на 256)

/*@ ensures \result == 1;
*/
uint8_t test_uint8_cast_mod256_eq (uint64_t a)
{
  return ((a)%256 == (uint8_t)(a));
}
http://frama-c.com/wp.html http://www.fokus.fraunhofer.de/download/acsl_by_example или вот еще. Короче, поставь и проверь

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

Конечно не обязательно, вот GCC — отличный пример смешивания C++ и C, советую почитать его исходники и сделать выводы. Мне вот что-то совсем не доставляет удовольствия их читать.

код это не Марк Твен. качество кода от его читабельности зависит косвенно.

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

Поправка. Вы не узнали о цене. Вы нашли какое-то число на просторах интернатах, в обсуждении бородатой давности.

Можете писать сколько хотите про четыре цифры, но я подозреваю что цена версии странным образом либо совпадает с этими цифрами или отличается от них не более чем на 10~20% процентов.

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

Карпов, почему ты считаешь, что программист не может быть владельцем своего предприятия в одном лице?

Может. Более того, я считаю, что маленький бизнес — это хорошо. Я даже статью на эту тему писал: "Не бойтесь маленького бизнеса".

Однако это не означает, что мы кому-то что-то должны. Я уже устал объяснять на примере CppCat, что ну нет здесь для нас бизнеса. Не получается построить у нас бизнес, работая с индивидуальными разработчиками. Поэтому все здесь советы и критика на тему того, что мы не работаем с отдельными разрабочтиками, проходит мимо. Вопрос закрыт. Если кто-то уверен, что мы упустили волшебную нишу, так используйте её! Создайте и предложите статический анализатор для массового пользователя! Зачем указывать нам на ошибки, лучше воспользуйтесь ими!

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

Да, точно, все там есть. Я же даже смотрел на эту фраму, правда давно и очень вскользь. Показалась (что в тот раз, что сейчас) какой-то адово сложной штукой для академиков.

Хорошо, вопрос снимается, предикаты в каментах давно и успешно используют

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

Andrey_Karpov_2009, а вы, кстати, не экспериментировали со статическими проверками с помощью предикатов в коде? Кто-то вообще (из статических анализаторов) так делает? Ну, что-то типа такого:

Существуют различные варианты разметки кода (например, SAL). И есть различные анализаторы, работающие с разметкой (например, уже упомянутый Frama-C). Но у этого направления есть большой недостаток, из-за которого мы решили не делать в этом направлении никаких шагов. Без разметки, такие анализаторы практически бессильны. Это значит, что нельзя запустить анализатор на код и найти какие-то ошибки. В начале код надо разметить. Невероятно возрастает стоимость внедрения, да и просто попробовать сложно.

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

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

для objective-c и osx что-то планируется/есть?

Пока нет. Но направление перспективное.

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

код это не Марк Твен. качество кода от его читабельности зависит косвенно.

Зато скорость развития OpenSource-проекта прямо пропорционально зависит от читабельности его кода. И GCC здесь весьма посредственный пример, в GCC крестцы внутри сишных файлов, GCC не поддерживает собственное правило ".cc, .cp, .cxx, .cpp, .CPP, .C, .c++ для C++". В GCC код густо обмазан огромной кучей макросов. И т. д. А потому и разрабатывают GCC не так активно, как clang.

GCC-разрабы как в пауки в тёмном углу. Сидят и плетут свои паутины из макросов, распутывать которые то ещё удовольствие.

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

embarcadero

Я пропустил тот момент, когда на ЛОРе мнение говнокодеров, создавших всякие Borland'ы, Delphi и турбомоскали стало авторитетным и достойным цитаты.

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

Компиляторы, в отличие от оконных систем не стареют, а как хорошее вино – с годами становятся только лучше!

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

Компиляторы, в отличие от оконных систем не стареют, а как хорошее вино – с годами становятся только лучше!

Чушь. Как пример - Borland C++ был когда-то очень продвинутым компилятором.

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

И что же его погубило? Ах да, жадность. А вот открой они свой код, как это сделал какой-нибудь там Qt или NetScape, может и был жив бы этот, как там его, bcc32 вроде.

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

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

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

А ещё товарищ Столман неустанно душит всякие попытки открыть GCC для сторонних разработок.

https://lwn.net/Articles/582242/

The values of free software are fundamentally different from the values of open source, which make «better code» the ultimate goal. ... we had to take care to prevent that.

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

А вот открой они свой код, как это сделал какой-нибудь там Qt или NetScape, может и был жив бы этот, как там его, bcc32 вроде.

Компилятору от Watcom-а это не шибко повезло. Хотя компилятор был получше Borland-овского.

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

Ну, не совсем. В какой-то момент в Борланде эффективные манагеры подумали (https://www.quora.com/Why-did-Borland-fail): «А не будем мы с индивидуальными разработчиками больше работать. Будем с продавать большим компаниям задорого.» Звучит знакомо, не правда ли?

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

А ещё товарищ Столман неустанно душит всякие попытки открыть GCC для сторонних разработок.

Это случай так называемого вранья. На самом деле Столлман не хочет разработки закрытого софта на базе GCC.

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

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

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

На самом деле, мне непонятно причем здесь вообще частное лицо. Частному лицу вообще продукты для программирования не нужны. Ну разве что в рамках хобби. Но платить за хобби у программистов не в почёте :).

После этих слов разговаривать с вами или просто воспринимать всерьёз вообще бессмысленно.

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

Мы позиционируемся так. Есть анализатор PVS-Studio. Он постепенно учится поддерживать другие языки, но стоит при этом одну цену.

Мы позиционируемся так. Есть столовый набор, он постепенно расширяется (сначала там была только ложка, потом добавили еще и вилку) но стоит он при этом одну цену. Ну ок, дело ваше. Только мне не нужен весь набор, мне нужна только вилка. А если мне будет нужна ложка, я лучше куплю в соседнем ларьке, там у них ложки качественней. Верните мне деньги за ненужную мне ложку!

Знаете, у майкрософта были серьезные проблемы с антимонопольным комитетом в связи с такой политикой. https://ru.wikipedia.org/wiki/Европейский_союз_против_«Майкрософт»

Можно сказать, что мы наоборот только сделали бонус и скидку тому, кто использует одновременно анализатор и для C/C++ и для C#. Ему повезло.

А если кто-то берет анализатор именно ради C#, и прочие анализаторы лично ему и даром не нужны? Ну и надеюсь вы прочитали Влияние спонтанных социально-экономических факторов на качество программного обеспечения в расширенных социумах

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

1) Пусть раньше поддержку C/C++ в анализатор впиливали весь рабочий день(условно, можно также рассматривать в рамках обсуждения не рабочий день, а рабочее время в месяц), он стоил 1000.
2) Теперь рабочее время тратится также на C#, логично заключить, что компоненту C/C++ теперь уделено меньше внимания. И исходя из этого ДА, логично теперь уменьшить цену анализатора только лишь C/C++.
Так что не заговаривай зубы тут. Честно говоря, меня не раздражает этот продукт, и думаю он в некотором роде даже полезен. Тошнит от вранья таких как ты(не имеем возможности снизить цену, не можем продавать разные компоненты отдельно, налоги, зарплата...) Все это словестная акробатика. Было бы лучше просто честно сказать «Мы жадные ребята, хотим много золота и не хотим особенно напрягаться».
Отвечая на возможный вопрос «Почему я считаю цену высокой?», напишу слудующее: Иногда сравниваю коммеческие ит-продукты с ценой продуктов microsoft, уж не думаю, что на винду потрачено меньше человеко-часов чем на обсуждаемый анализатор, тем не менее если судить по цене, то так и не скажешь.

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

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

Спасибо за теплые слова. Я Вас тоже люблю.

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

На самом деле, мне непонятно причем здесь вообще частное лицо. Частному лицу вообще продукты для программирования не нужны. Ну разве что в рамках хобби. Но платить за хобби у программистов не в почёте :).

После этих слов разговаривать с вами или просто воспринимать всерьёз вообще бессмысленно.

Ok. Хотя я не понимаю, где я так сильно не прав. Можно притянуть сюда индиразработчиков и т.д. Но я думаю, это направление так же ненадолго, как и почти умерший сейчас shareware, разрабатываемая одиночками. Что ещё? Одиночный аутсорсинг... Это, в каком-то смысле, всё равно работа. Ибо если вдруг дело дойдёт до тяжёлого дорогого софта или дорогих библиотек, всё равно это предоставит заказчик. Человек сам себе не будет покупать эти библиотеки или приложения. Вот Вы сами чем деньги зарабатываете?

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

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

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

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

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

Попутно мы совершаем другие полезные и добрые дела. Мы делаем мир открытых программ чуть лучше. Мы дарим лицензии некоторым открытым проектам. Мы пишем образовательные материалы и так далее.

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

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

Это чтобы немного разбавить поток «тёплых слов».

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

Это чтобы немного разбавить поток «тёплых слов».

Спасибо

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

Вот Вы сами чем деньги зарабатываете?

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

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

не думаю, что на винду потрачено меньше человеко-часов чем на обсуждаемый анализатор, тем не менее если судить по цене, то так и не скажешь

Ну, справедливости ради, на какой-нибудь Instagramm потрачено человеко-часов явно меньше, чем на тот же анализатор (оцениваю по тому, что единственная сложная вещь в Instagramm - это то, что он не валится под наплывом пользователей, но даже это отчасти результат просто огромного парка серверов, а всё остальное напишет любой фрилансер за разумное время и сроки, а для разработки статического анализатора требуется разбираться в дебрях всяких стандартов и особенностях компиляторов C/C++/C#, которые нормально далеко не каждый разработчик на этих языках знает), а капитализация у него явно больше, чем у PVS Studio. А разгадка простая - всё дело в массовости продукта. Винда всем нужна, а статический анализатор даже в самом лучшем случае - только программистам на языках, которые он поддерживает. А программистов относительно общего количества пользователей ПК исчезающе мало, особенно если речь идёт о C/C++, а не каком-нибудь вебе.

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

Разница между clang и gcc была только в том, что clang не раскрывал typedef-ы. А, ну и символами '~' и '^' красиво показывал на место ошибки.

Сейчас и этой разницы нет.

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

Попробуй почитать документацию.

В архиве с анализатором кроме ридми ничего не припомню. А в ридми ничего полезного нет.

p.s. Свой отчет и замечания я отправил разработчикам.

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

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

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

Утилита Plog Converter

Не помню, была ли такая утилита в комплекте. Но чем она лучше grep и awk, которыми я и воспользовался?

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

Ничем, просто ынтрпрайз™®©: утилиты на C++ с наследованиями и фабриками вместо двухстрочника на баше.

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

Впрочем, я его только неделю назад получил, а ссылка от 12.09.

Не могу сейчас проверить, что было в том архиве. Мне письмо с архивом пришло 24 августа.

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

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

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

Сейчас что clang, что gcc выдаёт невнятную простыню на 5 экранов, если где-то в обмазанный шаблонами код что-то чуть-чуть не то передашь.

А весь восторг по поводу шланга (когда он только начал появляться) сводился к тому, что «Смотрите, смотрите! он пишет std::string, а не std::basic_string< _Char ... !11»

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