» » » Проверка кода Reiser4 статическим анализатором PVS-Studio

 

Проверка кода Reiser4 статическим анализатором PVS-Studio

Автор: admin от 30-12-2017, 14:35, посмотрело: 55

Проверка кода Reiser4 статическим анализатором PVS-Studio


Доброго времени суток!



Эта статья посвящена применению бесплатной версии (для свободных и открытых проектов) статического анализатора PVS-Studio. Проверять мы будем исходный код файловой системы Reiser4 и ее утилит.

этой ссылке, где можете кратко прочитать про данный статический анализатор.



Также у компании разработчика есть официальный блог на Хабрахабре где часто появляются отчеты по проверки различных открытых проектов.



Немного почитать про Reiser4 можно на Вики ядра.

Начнем пожалуй с утилит, а конкретно с библиотеки libaal. Затем проверим утилиты reiser4progs, а проверку кода в ядре оставим напоследок.



Предварительная подготовка



Для начала нам необходимо поставить PVS-Studio. На официальном сайте можно найти deb и rpm пакеты, а также просто архив с программой. Устанавливаем самым удобным для нас способом.



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

// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com




Дабы вручную не добавлять данные строки в каждый файл, напишем небольшой скрипт на bash'е. Для этих целей используем потоковый текстовый редактор sed:

#!/usr/bin/bash

for str in $(find $1 -name '*.c'); do
	sed -i -e '1 s/^/// This is an open source non-commercial project. Dear PVS-Studio, please check it.n// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.comnn/;' $str
done




Для удобства напишем еще один скрипт, для сборки и запуска PVS-Studio:

#!/usr/bin/bash

pvs-studio-analyzer trace -- make -j9 || exit 1
pvs-studio-analyzer analyze -o log.log -j9  || exit 1
plog-converter -a GA:1,2 -t tasklist log.log  || exit 1




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



Проверка libaal-1.0.7



libaal это библиотека абстракции структур Reiser4, используемая reiser4progs.





Если не считать предупреждения, связанные с повторным объявлением стандартных типов данных, то возможные проблемы у нас только в строках 68, 129 и 139 в файле src/bitops.c:



V629 Consider inspecting the 'byte_nr 3' expression. Bit shifting of the 32-bit value with a subsequent expansion to the 64-bit type.



В 129 и 139 строке код следующего вида:

bit_t aal_find_next_set_bit(void *map, bit_t size, bit_t offset)
{
<...>
        unsigned int byte_nr = offset  3;
<...>
                unsigned int nzb = aal_find_nzb(b, bit_nr);
<...>
                if (nzb < 8)
                        return (byte_nr  3) + nzb;
<...>
}


В данном случае ошибку легко исправить заменив объявления переменных типа unsigned int на тип bit_t.



Что касается строки 68:

bit_t aal_find_first_zero_bit(void *map, bit_t size)
<...>
	unsigned char *p = map;
	unsigned char *addr = map;
<...>
			return (p - addr)  3;
<...>
}


то тут я теряюсь в догадках с чего это вдруг PVS считает (p-addr) 32-битным. Даже sizeof() выдает четкие 8 байт (я использую amd64).



Проверка reiser4progs-1.2.1





А вот в reiser4progs все гораздо интереснее и в некоторых местах печальнее. Вообще, Эдуард Шишкин упомянул, что: «после того, как были на

Источник: Хабрахабр

Категория: Операционные системы » Linux

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *