﻿# Мои аплодисменты проекту Tor

Поздравляю авторов проекта Tor\. Я не смог найти в этом проекте ошибок, проверив его с помощью статического анализатора PVS\-Studio\. Такие слова после проверки программ я пишу очень редко, и авторам проекта можно гордиться собой\. Вручаю медальку за качественный код\.

![0507_Tor_recheck_ru/image1.png](https://import.viva64.com/docx/blog/0507_Tor_recheck_ru/image1.png)

Это не первая проверка проекта Tor с помощью анализатора PVS\-Studio\. Предыдущая проверка состоялась в 2012 году, и тогда я написал небольшую заметку: "[Безопасность, безопасность\! А вы её тестируете?](https://pvs-studio.ru/ru/blog/posts/cpp/0178/)"\. Что интересно, 5 лет назад я мог найти в проекте ошибки с помощью PVS\-Studio, а сейчас не могу\.

За прошедшие 5 лет мы существенно развили диагностические возможности PVS\-Studio и он научился выявлять новые паттерны ошибок, такие как \- утечки памяти, мертвый код, неправильную работу со строками типа BSTR и много другое\. Я легко нахожу с помощью анализатора PVS\-Studio ошибки в коде таких проектов, как GCC, LLVM, C\+\+ REST SDK, GDB, Qt, Chromium, Linux kernel \(см\. [список статей](https://pvs-studio.ru/ru/blog/inspections/)\)\. Но сесть и написать статью про ошибки, найденные в Tor, я не смог\!

О чем это говорит? Авторы проекта начали очень тщательно и серьезно относиться к качеству и безопасности кода\.

Были случаи, когда в начале мы [не находили](https://pvs-studio.ru/ru/blog/posts/0189/) ошибки, а затем, когда анализатор становился мощнее, начинали [находить](https://pvs-studio.ru/ru/blog/posts/cpp/0406/) ошибки\. Но это, кажется, впервые, когда мы раньше находили ошибки, а теперь не находим\. Разработчики Tor молодцы\! Вот образец для подражания другим программистам\.

Пара слов о самой проверке\. Проверялись самые свежие на момент написания статьи исходные коды проекта Tor\. Для анализа использовался [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/) версии 6\.15\. Анализатор выдаёт некоторое количество сообщений, но все они являются ложными или не несут пользы\. По итогам изучения отчёта, я выписал 9 паттернов ложных срабатываний и со временем мы доработаем анализатор\. Так что, скорее, получилось, что это была не проверка проекта Tor, а дополнительное тестирование PVS\-Studio :\)\.

Как я уже сказал, есть сообщения, которые вроде и не совсем ложные, но и толку от них никакого нет\. Простой пример:

```cpp
ssize_t read_all(...., size_t count, ....)
{
  ....
  if (count > SIZE_T_CEILING || count > SSIZE_MAX) {
```

Анализатор выдаёт предупреждение: [V590](https://pvs-studio.ru/ru/docs/warnings/v590/) Consider inspecting this expression\. The expression is excessive or contains a misprint\. util\.c 2116

Взглянем на строчку после раскрытия макросов:

```cpp
if (count > ((size_t)(0x7fffffffffffffffL -16)) ||
    count > 0x7fffffffffffffffL) {
```

Да, код избыточен: второе сравнение можно удалить\. Однако ясно, что править этот код не надо, ведь при других значениях констант проверка может быть полезной\. Т\.е\. это ложное срабатывание, но я не знаю, как научить анализатор игнорировать такие места\.

Есть предупреждения по делу, но всё равно они не тянут на написание статьи под громким названием "Баги в проекте Tor"\. Один из таких случаев:

```cpp
const char *err = strchr(cp, ':')+2;
tor_assert(err);
```

Ассерт никогда не сработает\. Даже если функция _strchr_ вернёт _NULL_, то указатель _err_ будет хранить хоть и не валидное значение _\(\(char \*\)2\)_, но всё равно не _NULL_\. Правильно было бы написать так:

```cpp
const char *err = strchr(cp, ':');
tor_assert(err);
err += 2;
```

Впрочем, как я понимаю, функция _strchr_ никогда не вернёт _NULL_, и проверка написана просто на всякий случай\.

Из всех предупреждений PVS\-Studio я, пожалуй, могу выделить только одно, про которое можно сказать, что оно указывает на ошибку\. Рассмотрим соответствующий участок кода:

```cpp
static time_t
edge_of_accounting_period_containing(time_t now, int get_end)
{
  ....
  case UNIT_MONTH: {
    if (tm.tm_mday < cfg_start_day ||
        (tm.tm_mday < cfg_start_day && before)) {
      --tm.tm_mon;
    }
  ....
}
```

Предупреждение PVS\-Studio: [V686](https://pvs-studio.ru/ru/docs/warnings/v686/) A pattern was detected: \(tm\.tm\_mday < cfg\_start\_day\) \|\| \(\(tm\.tm\_mday < cfg\_start\_day\) && \.\.\.\)\. The expression is excessive or contains a logical error\. hibernate\.c 333

Проверку можно сократить до:

```cpp
if (tm.tm_mday < cfg_start_day) {
```

Вероятнее всего в этом условии допущена какая\-то опечатка или логическая ошибка\.

Больше мне написать нечего\. Возможно, конечно, я просмотрел ещё какую\-то ошибку, но общую картину это всё равно не меняет\. Проверяя другие открытые проекты, я и мои коллеги выписываем ошибки десятками и сотнями\. Сейчас в нашей [коллекции](https://pvs-studio.ru/ru/blog/examples/) уже собрано более 10000 ошибок, найденных нами в различных проектах\. В проекте Tor я бы тоже с радостью их нашел, а потом описал в статье 20\-30 интересных ошибок, но не смог\. Ещё раз хвалю авторов этого проекта\.