Комментарии 18
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);.
Возможно, это самое интересное. Если действительно туда приходит строка из вне, то результат может быть очень и очень интересным и может неожиданно обнаружиться настоящая уязвимость.
Т.е. если проверить следующий код, и даже явно указать -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) Рассмотрел эти случаи и добавил в статью. В конечном итоге все сводится к строковым константам.
4) Жаль. Ой, я хотел сказать, это отлично! Значит здесь уязвимости нет. Спасибо за исследование.
А вот вопрос про free license и комментарии.
Допустим, я контрибьютор в опенсорсный проект. Я его форкнул, в свой форк добавил комментарии, пользуюсь pvs-studio. Потом свои изменения оформляю в виде патчей, из которых убираю комментарии, и отправляю патчи в апстрим; комментарии убираю не потому что мне жалко, а потому что апстрим патч с комментариями не примет. Нарушаю ли я условия бесплатной лицензии?
То это не совсем нарушение. Нужно тогда в соглашение добавить понятие производных работ (как в копилефт лицензиях).
Задачи схитрить и не было — я просто задумался, как совместить лицензию и распределенную модель разработки (не псевдодецентрализованную, как обычно на гитхабе, а полноценно, как в случае с linux kernel, когда копий кода тысячи и "главного" варианта нет вообще). Предположим, проверяли бы не reiser4, а btrfs. Получилась бы ровно описанная ситуация.
Но, если поставить задачу схитрить… :-)
Допустим, даже без форков. Делаю в репозитории ветку pvs, туда добавляю комментарии, настраиваю CI на проверку этой ветки PVS-Studio. В эту ветку ничего не коммитится. На коммиты в мастер ставлю хук, который делает merge (или rebase на master) в ветку pvs. Формально условия лицензии не нарушены, фактически комментарии в ветке, в которую никто не смотрит :-)
Потрясающее инженерное решение — добавлять пару строк а начало каждого анализируемого файла. Похоже на костыль, который остался.
Во вторых, читаем здесь:
- К сожалению, у нас ничего не получилось с экспериментальным продуктом CppCat. Мы не знаем, как построить успешный бизнес в сфере статического анализа кода, продавая персональные лицензии. Поэтому сейчас продукт PVS-Studio позиционируется исключительно как B2B решение.
- Вы должны вписать в начало каждого файла две строки с комментарием. Мы предоставляем на выбор несколько вариантов. Это своего рода плата за возможность бесплатного использования анализатора PVS-Studio.
- Конечно, предложенные варианты подходят далеко не всем. В этом и состоит их смысл. Если ни один из предложенных вариантов вам не подходит, то предлагаем обсудить с нами вопрос покупки лицензии.
Команда небольшая, это не Google, Яндекс или другая крупная компания, которая может потратить деньги на юристов, инженеров и других людей которые сделают по другому. Они могли вообще не делать бесплатную версию, или ограничиться версией под Windows и Visual Studio.
Не часто с его помощью ошибки нахожу, зато когда находит, то волосы дыбом встают от ужаса, что такие косяки можно было пропустить.
Проверка кода Reiser4 статическим анализатором PVS-Studio