LINUX.ORG.RU

Используй несколько разных анализаторов, у них у всех есть свои сильные и слабые стороны. Так делает NASA.

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

Используй несколько разных анализаторов, у них у всех есть свои сильные и слабые стороны. Так делает NASA.

Какие еще анализаторы вы посоветуете?

Мне не понятно, почему cppcheck пропустил две явные ошибки? Даже gcc ругается на присвоение 32000.

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

Ну вот gcc и используёте для подобного рода ошибок, раз он ругается. Ещё в llvm/clang'е хороший статический анализатор, говорят.

про наса, там куча софта перечислена
http://gigaom.com/2012/08/20/nasa-scrubbed-mars-rover-code-clean-over-and-over/

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

Мне не понятно, почему cppcheck пропустил две явные ошибки? Даже gcc ругается на присвоение 32000.

Отладь @ пофикси

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

Ну вот gcc и используёте для подобного рода ошибок, раз он ругается.

Он ругается только на одну ошибку. А выход за границы он тоже не видит.

Ещё в llvm/clang'е хороший статический анализатор, говорят.

Такое же говно, как и cppcheck.

andreyu ★★★★★
() автор топика

Чтоб такое отловить, статический чекер дожен быть очень умным. Возможно таких вообще не существует в природе.

Кстати, clang не возмутился на 32000 в char, gcc - возмутился (warning: overflow in implicit constant conversion). А чем динамический валгринд не устраивает? Он все рассказал на присвоении: Invalid write of size 1

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

Кстати, clang не возмутился на 32000 в char

q.cc:6:13: warning: implicit conversion from 'int' to 'char' changes value from 32000 to 0 [-Wconstant-conversion]
    v[11] = 32000;
          ~ ^~~~~

По умолчанию выключено, похоже.

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

А выход за границы он тоже не видит.

А как оно должно увидеть «выход за границу»? Это же нужно знать контракт класса std::vector, вывести который из кода вряд ли представляется возможным. С точки зрения компилятора/анализатора класс std::vector мало чем отличается от любого другого пользовательского класса вроде QVector, у которого также есть свой контракт.

К тому же выхода за границу внутреннего буфера std::vector может и не быть, если capacity > size. Будет нарушен контракт, и будет записано число в доступную область памяти, этого даже всякие runtime анализаторы вроде valgrind не поймают.

kamre ★★★
()
Ответ на: комментарий от i-rinat
$ g++ -Wall -pedantic -g cpp_t.cc   -o cpp_t
cpp_t.cc: In function ‘int main(int, char**)’:
cpp_t.cc:6: warning: overflow in implicit constant conversion
$ clang++ -Wall -pedantic -g cpp_t.cc   -o cpp_t
$ clang --version
clang version 1.1 (Debian 2.7-3)
Target: i386-pc-linux-gnu
Thread model: posix
anonymous
()
Ответ на: комментарий от anonymous
$ clang++ --version
Debian clang version 3.4-1 (trunk) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix

Версии разные.

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

говорят, в jdk хороший анализатор кода :)

import java.util.ArrayList;

public class TestArrayList {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.set(10, 0);
        System.out.println(list.get(10));
    }
}

Ни компилятор javac, ни Code Inspections в IDEA ничего не показали.

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

А как оно должно увидеть «выход за границу»? Это же нужно знать контракт класса std::vector, вывести который из кода вряд ли представляется возможным.

можно же понять что это именно std::vector и взять «контракты» из своей базы. Не обязательно валидировать и саму реализацию стандартных компонент. Компилятор, конечно, не обязан выходить за рамки формальной проверки, а статик чекер вполне себе может, это же как раз его работа.

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

А чем динамический валгринд не устраивает? Он все рассказал на присвоении: Invalid write of size 1

Всем угодил. Но для него нужно обойти все возможные пути алгоритма. Что «несколько» сложнее и дольше.

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

А как оно должно увидеть «выход за границу»?

Согласен, с вектором все гораздо сложнее, но не заметить 32000 - это уже перебор.

Прошелся cppcheck по своим последним проектам. С установками на максимум, с указанием всех путей к нужным хедерам. Все что он нашел это c-style cast. Не поверил я ему, скачал триальный pvs, собрал проекты под виндой - тот тоже ничего не нашел. А на хабре Andrey2008 (если не путаю ник) очень хвалит свое детище.

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

А это как раз по существу, ибо лучший способ найти ответ на

почему cppcheck пропустил две явные ошибки?

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

можно же понять что это именно std::vector и взять «контракты» из своей базы. Не обязательно валидировать и саму реализацию стандартных компонент. Компилятор, конечно, не обязан выходить за рамки формальной проверки, а статик чекер вполне себе может, это же как раз его работа.

Тоже так думал, но cppcheck считает иначе.

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

А это как раз по существу, ибо лучший способ найти ответ на

Проходите мимо, в этом топике вы бесполезны.

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

Но для него нужно обойти все возможные пути алгоритма. Что «несколько» сложнее и дольше.

gcov помогает узнать, все ли места обошли тесты.

Ты бы баг отписал на трекер. Глядишь, кто-то реализует.

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

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

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

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

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

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

У тебя генитальная фиксация. Лечись кастрацией. Я говорю про количество нулей на счету в банке, а не про анатомические особенности. Именно этот фактор определяет социальный статус, а вовсе не то, на чем ты так болезненно зафиксирован.

anonymous
()

смотря как анализирует. в самом векторе оператор []: No bounds checking is performed.

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

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

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

смотря как анализирует. в самом векторе оператор []: No bounds checking is performed.

Для того и нужен статический анализатор. Этот же пропустил и гораздо более простую для анализа ошибку.

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

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

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

Статический анализатор такие ошибки не пропускает. Все, что ты тут упоминал, никакого отношения к статическим анализаторам не имеет.

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

Это все похвальба. Но толку от нее никакого. Вы можете с таким же успехом назвать себя президентом США. Вы обычный малолетний хвастун.

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

И в чем же заключается мое неосиляторство?

Он намекает что тебе стоит написать багрепорт авторам cppcheck

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

Что бы говорить о количестве нулей в банке, нужно иметь мозги.

Количество нулей с мозгами не коррелирует

quest ★★★★
()

Нафига вообще cppcheck если gcc и clang даже БЕЗ опций это ловят

$ g++ test.cpp 
test.cpp: In function ‘int main(int, char**)’:
test.cpp:6:11: warning: overflow in implicit constant conversion [-Woverflow]
     v[10] = 32000;
           ^
$ clang test.cpp 
test.cpp:6:13: warning: implicit conversion from 'int' to 'char' changes value from 32000 to 0 [-Wconstant-conversion]
    v[10] = 32000;
          ~ ^~~~~
1 warning generated.
quest ★★★★
()
Ответ на: комментарий от quest

Он намекает что тебе стоит написать багрепорт авторам cppcheck

Оно мне нужно? Я проинформировал читающих эту ветку о баге. Дабы они в дальнейшем не полагались на этот анализатор. Кто считает, что этот баг стоит запостить, пусть это сделает сам, а не говорит сделать это мне.

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

Количество нулей с мозгами не коррелирует

Вы это не мне, а анонимусу скажите. Своими нулями именно он тут хвастается.

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

Нафига вообще cppcheck если gcc и clang даже БЕЗ опций это ловят

Подумайте сами, зачем нужен статический анализатор. А заодно покажите, как clang или gcc ловит выход за границы в приведенном мною примере.

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

А заодно покажите, как clang или gcc ловит выход за границы в приведенном мною примере.

По факту они даже без опций эту проблему показывают что я выше и привел.

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

покажите, как clang или gcc ловит выход за границы в приведенном мною примере.

По факту они даже без опций эту проблему показывают

Выход за границу вектора?

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

Выход за границу вектора?

А ну да это я краем глаза смотрю, ну юзайте at() Кто из свободных такое просекает в этом коде без запуска?

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