Как стать автором
Обновить

Комментарии 18

Не могу врубиться, что за ошибка в cde40_repair.c. Может, там надо знать определение ENTRY_LEN_MIN?
Виноват, сам перепутал приоритет сложения и сравнивания. Нет там ошибки, просто где-то в дебрях макросах получается всегда истина.

Позже еще раз код пересмотрю.
Спасибо за статью! Несколько несвязанных комментариев:

1) Читателя о добавлении комментариев. Не обязательно делать скрипты. Как вариант, можно воспользоваться открытой утилитой how-to-use-pvs-studio-free.

2) return (p — addr) << 3;

Скорее всего, проект компилировался и проверялся в 32-битном режиме. Это значит, что указатели 32-битные. Результат вычитания указателей будет иметь тип ptrdiff_t, который в 32-битном приложении, также 32-битный. А вот тип bit_t видимо всегда 64-битный. Из-за этого и возникает предупреждение.

Чисто теоретически, если «p — addr» даст в результате, например, 1 ГБ, то произойдёт переполнение при сдвиге (<< 3). На практике, такого не случится и настоящей ошибки нет. Но теоретически, она есть.

3) child->in_parent.item_pos + 1 != 0

Даже если item_pos будет равно 0xFFFF, всё равно условие ВСЕГДА истинно.

Переменная item_pos имеет unsigned short. Любое значение (в том числе и 0xFFFF) спокойно преобразовывается в тип int. И мы получаем, например 0x0000FFFF. При добавлении 1 переполнения не возникнет и мы получим 0x00010000. Именно поэтому анализатор столь категоричен в предупреждении.

4) Мне кажется, стоило всё-таки рассмотреть код, где анализатор выдаёт такие предупреждения, как V618 It's dangerous to call the 'fprintf' function in such a manner, as the line being passed could contain format specification. The example of the safe code: printf("%s", str);.

Возможно, это самое интересное. Если действительно туда приходит строка из вне, то результат может быть очень и очень интересным и может неожиданно обнаружиться настоящая уязвимость.
2) Нет, режим был именно 64-битным. Я проверял на отдельном файле и там-же писал printf("%u", sizeof(p — addr)). PVS ругается, а sizeof() выдает 8.
Т.е. если проверить следующий код, и даже явно указать -m64 ошибка останется:
// 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

#include <stdio.h>
#include <stdint.h>

typedef uint64_t bit_t;

bit_t qwe(unsigned char q) {
	unsigned char *p = &q;
	unsigned char *addr = &q;

	printf("%u\n", sizeof(((p - addr) << 3)));
	return (p - addr) << 3;
}

int main(void) {
	bit_t ret = qwe(1);

	return 0;
}


3)
преобразовывается в тип int

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

4) Рассмотрел эти случаи и добавил в статью. В конечном итоге все сводится к строковым константам.
2) Хм. Спасибо. Что-то не так. После новогодних праздников попрошу коллег изучить этот момент.

4) Жаль. Ой, я хотел сказать, это отлично! Значит здесь уязвимости нет. Спасибо за исследование.
2) Похоже действительно ложное срабатывание. Если bit_t объявить как intptr_t или ptrdiff_t то ошибки не будет, а если объявить как uint64_t, int64_t или long int (как он у меня определяется в заголовке stddef.h), то возникает ошибка.

А вот вопрос про free license и комментарии.


Допустим, я контрибьютор в опенсорсный проект. Я его форкнул, в свой форк добавил комментарии, пользуюсь pvs-studio. Потом свои изменения оформляю в виде патчей, из которых убираю комментарии, и отправляю патчи в апстрим; комментарии убираю не потому что мне жалко, а потому что апстрим патч с комментариями не примет. Нарушаю ли я условия бесплатной лицензии?

Я чувствую, что есть нарушение, так как по факту ошибки правятся без упоминания PVS-Studio, однако, что по существу ответить, я не знаю. Вы хитрый Неуловимый Джо!
Ну если судить по этому тексту: www.viva64.com/ru/b/0457/#ID0EZRAG
То это не совсем нарушение. Нужно тогда в соглашение добавить понятие производных работ (как в копилефт лицензиях).

Задачи схитрить и не было — я просто задумался, как совместить лицензию и распределенную модель разработки (не псевдодецентрализованную, как обычно на гитхабе, а полноценно, как в случае с linux kernel, когда копий кода тысячи и "главного" варианта нет вообще). Предположим, проверяли бы не reiser4, а btrfs. Получилась бы ровно описанная ситуация.

Но, если поставить задачу схитрить… :-)


Допустим, даже без форков. Делаю в репозитории ветку pvs, туда добавляю комментарии, настраиваю CI на проверку этой ветки PVS-Studio. В эту ветку ничего не коммитится. На коммиты в мастер ставлю хук, который делает merge (или rebase на master) в ветку pvs. Формально условия лицензии не нарушены, фактически комментарии в ветке, в которую никто не смотрит :-)

НЛО прилетело и опубликовало эту надпись здесь
В качестве варианта — вместо последнего return сделать break, а конце функции написать return LESS_THAN. И овцы целы, и PVS доволен.
Самое правильное — пометить функцию impossible как не возвращающую управление. Можно использовать [[noreturn]], __declspec(noreturn), __attribute__((noreturn)).
НЛО прилетело и опубликовало эту надпись здесь

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

Купите лицензию и ничего вам добавлять не нужно, это раз.
Во вторых, читаем здесь:
  • К сожалению, у нас ничего не получилось с экспериментальным продуктом CppCat. Мы не знаем, как построить успешный бизнес в сфере статического анализа кода, продавая персональные лицензии. Поэтому сейчас продукт PVS-Studio позиционируется исключительно как B2B решение.
  • Вы должны вписать в начало каждого файла две строки с комментарием. Мы предоставляем на выбор несколько вариантов. Это своего рода плата за возможность бесплатного использования анализатора PVS-Studio.
  • Конечно, предложенные варианты подходят далеко не всем. В этом и состоит их смысл. Если ни один из предложенных вариантов вам не подходит, то предлагаем обсудить с нами вопрос покупки лицензии.

Команда небольшая, это не Google, Яндекс или другая крупная компания, которая может потратить деньги на юристов, инженеров и других людей которые сделают по другому. Они могли вообще не делать бесплатную версию, или ограничиться версией под Windows и Visual Studio.
Обожаю PVS!
Не часто с его помощью ошибки нахожу, зато когда находит, то волосы дыбом встают от ужаса, что такие косяки можно было пропустить.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации