Topic: Результаты статического анализа

Провел статический анализ с помощью PVS
Для проекта mvtools2:
файл MVBlockFps.cpp в конструкторе MVBlockFps строка 40-41

        if (nOverlapX!=0 || nOverlapX!=0)
                env->ThrowError("MBlockFps: Overlap must be 0");  // may be implemented later but some modes are not clear

явно ошибка копи-паста, скорее всего нужно

        if (nOverlapX!=0 || nOverlapY!=0)
                env->ThrowError("MBlockFps: Overlap must be 0");  // may be implemented later but some modes are not clear

Далее набор из однотипных

        DebugPrintf("Degrain2: get source frame %d clip %d",n,super);

Для PClip и IClip не перегружены операторы преобразования к int. Либо нужно ввести перегрузку, либо заменить %d на %p
файл MVDegrain2.cpp строчки 237, 338, 345, 352, 359; файл MVSuper.cpp строка 157

Файл MVDepan.cpp строка 711

    int nf = (backward) ? ndest: ndest; // set next frame number as data frame if backward

Ошибка копи-паста, скорее всего нужно так:

    int nf = (backward) ? ndest - 1 : ndest; // set next frame number as data frame if backward

Функция GetAbsolutePelPointer полностью идентична GetAbsolutePointerPel1. Файл mvinterface.h строки 710 и 665.

Типичная ошибка оперирования с IEEE754 double

        if (fGamma == 1.0)

Рекомендуется заменить на

        if (fabs(fGamma - 1.0) <= 1e-4)

Точность 10^(-4) вполне достаточна.
Файлы maskfun.cpp строки 27, 167, 218. Схожее в файле mvdepan.cpp строках 313, 414, 547

Обратите внимание на возможное переполнение в MVMask::Length файл MVMask.cpp строки 89-97

        double norme = double(v.x * v.x + v.y * v.y) / ( pel * pel);

Прошу не воспринимать этот пост как упрек или что-то подобное. Я лишь хочу, чтобы SVP был быстрым и содержал по возможности меньше ошибок.

Re: Результаты статического анализа

Эту бы энергию да в мирных целях  hmm
Результаты работы следует направлять куда-то туда.
MVTools к SVP отношения не имеет уже достаточно давно.

Даже не касаясь этого, списочек слабоват, там на порядки больше интересного  big_smile

Типичная ошибка оперирования с IEEE754 double
fGamma - не результат расчета, а входной параметр, поэтому прямое сравнение вполне допустимо wink

3 (edited by yartat 22-09-2012 12:42:56)

Re: Результаты статического анализа

Проект jsoncpp.
Файл json_reader.cpp строки 588-589

      bool badTokenType = ( token.type_ == tokenArraySeparator  &&
                            token.type_ == tokenArrayEnd );

Скорее всего нужно заменить на

      bool badTokenType = ( token.type_ == tokenArraySeparator  ||
                            token.type_ == tokenArrayEnd );

Проект svpflow1.
Файл MVSuper.cpp стока 76

    if(yRatioUV==2 && vi.height&1) vi.height++; // even

yRatioUV всегда будет 2

Обратите внимание на возможное переполнение в PlaneOfBlocks::SearchMVs_common файл PlaneOfBlocks.cpp строки 274

    if(mode) lambda = int(min(lambda/pow(plevel,levelsCount-nLevel-1)/(nPel*nPel),INT_MAX/100.0));

PS:  в первом посте я анализировал MVTools2 2.5.11.9 SVP edition, исходники брал с страницы загрузки на wiki. Насколько я вижу mvtools2 используется в SVPMark

4 (edited by yartat 22-09-2012 13:12:18)

Re: Результаты статического анализа

Chainik
Типичная ошибка оперирования с IEEE754 double
fGamma - не результат расчета, а входной параметр, поэтому прямое сравнение вполне допустимо wink

И да и нет  wink  все зависит от компилятора или, если быть точным, от оптимизатора. Если оптимизатор генерирует код сравнения величин как восьмибайтовые блоки памяти, то нам повезло, а вот если будет код сравнения через FPU, то запросто могут вылезти косяки (при сравнении с нулем возможна нормализация операндов, при сохранении в стеке FPU могут появится погрешности) wink

Re: Результаты статического анализа

Это не мой код, но проблем не было  big_smile

А про ошибки в jsoncpp логично писать разработчикам jsoncpp

Re: Результаты статического анализа

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

Re: Результаты статического анализа

LordMerlin
Человек действительно хорошее дело длает
где?  hmm
с моей т.з. человек делает совершенно бесполезные действия (это про эту тему), причем не разобравшись в сути предмета (это про память)