?

Log in

No account? Create an account

Вдруг невозможное возможно? - Ваши рубидии уже у кобальта во ртути

Feb. 7th, 2013

08:44 pm - Вдруг невозможное возможно?

Previous Entry Share Next Entry


Дорвался, наконец, до Coverity (система статического анализа кода на предмет типичных программистских ошибок). В бытность стартапом много лет назад мы их продукт рассматривали на предмет полезности; тогда оказалось, что он скорее обуза. Сейчас же, в большой компании, где она уже установлена, почему бы не попробовать, тем более что столько времени прошло, должно было бы получше стать?

Ну и попробовал на свою голову (ниже псевдокод, демонстрирующий проблему, цветом выделены комментарии Coverity):

char* sName = strdup(что-то);
char* sTempName = NULL;
while (...) {
Assigning: "sTempName" = "sName". Now both point to the same storage.
    sTempName = sName ;
    if (...) {
        sName = strdup(что-то ещё);
    }
    ...
At conditional: "sTempName != sName" taking the true branch.
    if (sTempName != sName) {
"free" frees parameter "sTempName".
        free(sTempName);
    }
}
Using freed pointer "sName".
return sName;


Ну не зайки?

Upd: --enable-constraint-fpp

Comments:

[User Picture]
From:yatur
Date:February 8th, 2013 05:02 am (UTC)
(Link)
Зайки-то, может, и зайки, но такой код, даже если он прямо сейчас работает нормально, зело чреват глюками при любом изменении. Ну неужели там все настолько критично по производительности, что пользоваться std::string запрещает жаба?
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 8th, 2013 05:09 am (UTC)
(Link)
Этот код а) был начат более 10 лет назад, б) достался нам от силы 3 месяца назад, в) содержит в общей сложности около полумиллиона строк.

Ценен тем, что работает, за исключением редких случаев ошибок, сжирания памяти и квадратичной временной сложности, весьма быстро и неплохо, и по набору фич не знает равных. Кто и когда будет озадачен его приведением в порядок, мы еще не придумали.
(Reply) (Parent) (Thread)
From:rezkiy
Date:February 8th, 2013 05:23 am (UTC)
(Link)
мы будучи стартапом на прошлой неделе рассматривали Coverity и решили пока бзе него обойтись. В частности потому что 1) очень уж дорого 2) не похоже чтобы оно было намного сильнее майкрософтовского Префаста при наличии аннотаций. Без аннотаций оба много ругаются не по делу и не ругаются по делу.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 8th, 2013 05:40 am (UTC)
(Link)
У нас юникс, поэтому насчет майкрософта ничего не скажу. Похоже, что предпочтительный юзкейз - использовать Coverity с самого начала проекта и избегать ругательств по ходе их появления.
Справедливости ради замечу, что были найдены и реальные ошибки типа возвращения .c_str() от локальной строки.
(Reply) (Parent) (Thread)
From:rezkiy
Date:February 8th, 2013 06:01 am (UTC)
(Link)
Язык С примерно один и тот же, неделька издевательства над хедерами -- и ваш код компилируется вижал студией. Не факт конечно же что линкуется, но анализатору много не надо.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:February 8th, 2013 06:27 am (UTC)
(Link)
Спасибо, поинтересуюсь, есть ли возможность его использовать.
(Reply) (Parent) (Thread)
[User Picture]
From:fatoff
Date:February 8th, 2013 07:21 am (UTC)
(Link)
Это есть было фоновой активностью в одной силиконовой компании тут у инженегров года полтора назад: гонять Коверити И вставлять в базу данных исключения на все матерки не имеющие отношения К. Гугл их заставил это делать, в попытке стандартизовать хардверную часть Андроида.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 8th, 2013 07:38 am (UTC)
(Link)
С огромным кодом из чужих рук что еще делать? Не сидеть же читать его.
(Reply) (Parent) (Thread)
[User Picture]
From:sab123
Date:February 8th, 2013 03:41 pm (UTC)
(Link)
+1, оно - редкое говнище
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 9th, 2013 07:15 am (UTC)
(Link)
Какие альтернативы? cppcheck не находит практически ничего никогда.
(Reply) (Parent) (Thread)
[User Picture]
From:dbhost
Date:February 9th, 2013 07:45 am (UTC)
(Link)
lint?
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:February 9th, 2013 07:52 am (UTC)
(Link)
Который именно?
(Reply) (Parent) (Thread)
[User Picture]
From:dbhost
Date:February 9th, 2013 08:35 am (UTC)
(Link)
PC-Lint, если Вы работаете под виндой, используя кросс-компиляцию.
Если нет, то, по идее, Вам должен подойти FlexeLint. Но я им никогда не использовал, поэтому ничего про него не скажу.

Edited at 2013-02-09 08:36 am (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:February 9th, 2013 08:50 am (UTC)
(Link)
Здесь Flexelint по сравнению с Coverity не хвалят.
(Reply) (Parent) (Thread)
[User Picture]
From:sab123
Date:February 9th, 2013 04:35 pm (UTC)
(Link)
Вообще не пользоваться анализаторами?
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:February 9th, 2013 11:12 pm (UTC)
(Link)
И неделями искать трудновоспроизводимые ошибки в чужом коде?
(Reply) (Parent) (Thread)
[User Picture]
From:sab123
Date:February 10th, 2013 12:16 am (UTC)
(Link)
Так они все равно ничего не находят.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:February 10th, 2013 01:14 am (UTC)
(Link)
Нет, коверити нашел несколько реальных ошибок.
(Reply) (Parent) (Thread)
[User Picture]
From:stas
Date:February 9th, 2013 05:54 am (UTC)
(Link)
Все эти человекоподобные роботы одним миром мазаны. Глупые ошибки (которые ещё как бывают, что греха таить) они находят, а если код чуть сложнее - начинают галлюцинировать.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 9th, 2013 07:14 am (UTC)
(Link)
Глупых ошибок понаходилось несколько, спору нет. Данный же случай, хоть и относительно сложный, но практически идиома, так что конкретно его грех не распознавать.
(Reply) (Parent) (Thread)
[User Picture]
From:dbhost
Date:February 9th, 2013 07:47 am (UTC)
(Link)
2 и 4 могут быть по делу, если понять что у вас в первом if-e
1 и 3 - бред, да
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 9th, 2013 08:01 am (UTC)
(Link)
1 и 3 - объяснения предусловий возникновения ошибки. 2 - объяснение ветвления, необходимого для выполнения предусловий. 1 и 3 - просто констатации факта, а вот понятие о сочетаемости 1 и 2 у программы отсутствует.

К сожалению, я забыл, какое именно ветвление предполагалось в первом if-e; но в любом случае получается смешно.

(Reply) (Parent) (Thread)
[User Picture]
From:dbhost
Date:February 9th, 2013 09:01 am (UTC)
(Link)
по-моему, здесь либо опущены важные части для понимания, либо Coverity совсем плох.
например, 4-й коммент обоснован только, если при вызове free() sTempName == sName, что по коду не так.

кстати, а "полезные" констатации фактов можно отключать из выдачи?
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:February 10th, 2013 01:17 am (UTC)
(Link)
Не то чтобы "совсем плох", но несовершенен.

4-й коммент обоснован только, если при вызове free() sTempName == sName, что по коду не так

Мой пост именно об этом. :)

кстати, а "полезные" констатации фактов можно отключать из выдачи?

Не понял вопроса.
(Reply) (Parent) (Thread)
[User Picture]
From:dbhost
Date:February 11th, 2013 04:57 am (UTC)
(Link)
я имел ввиду можно ли подавлять отдельные ворнинги и целые классы сообщений как в линте с помощью комментариев или конфигураций.
но вижу, что похоже, можно.
(Reply) (Parent) (Thread)
[User Picture]
From:spamsink
Date:February 11th, 2013 05:41 am (UTC)
(Link)
Подавлять целые классы - с легкостью. Самый простой способ подавлять отдельные ворнинги - в GUI отметить галку "false positive" или "intentional". Система как-то умеет коррелировать проблемные точки и сама помечает дефекты как исправленные, если дать ей проанализировать очередную версию исходников с исправлениями.

Можно ли сделать указание подавить ворнинг с помощью комментария в коде, и если да, то как, я еще не выяснил.
(Reply) (Parent) (Thread)