﻿# PVS\-Studio хотел, но не смог найти баги в robots\.txt

На днях Google опубликовал исходники парсера robots\.txt\. Почему бы не прогнать уже проверенный всеми вдоль и поперек проект через PVS\-Studio и, возможно, найти ошибку\. Сказано \- сделано\. Жаль, что ничего значимого найти не удалось\. Ну что ж, тогда пусть это будет просто повод похвалить разработчиков Google\.

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

robots\.txt – индексный файл, который содержит правила для поисковых роботов\. Он действует для протоколов https, http и FTP\. Google сделала доступным для всех свой парсер файла robots\.txt\. Подробнее об этой новости можно почитать здесь: [Google открывает исходный код парсера robots\.txt](https://m.habr.com/ru/post/458428/)

Думаю, большинству читающих наши статьи известно, что делает PVS\-Studio\. Но на случай, если вы впервые в нашем блоге, дадим краткую справку\. PVS\-Studio – статический анализатор кода, который позволяет находить разнообразные ошибки, уязвимости и недочеты в проектах, написанных на С, С\+\+, С\# и Java\. Другими словами, PVS\-Studio является [SAST](https://pvs-studio.ru/ru/pvs-studio/sast/) решением и может работать как на пользовательских машинах или сборочных серверах, так и в [облаке](https://pvs-studio.ru/ru/blog/posts/cpp/0636/)\. А ещё команда PVS\-Studio очень любит писать [статьи](https://pvs-studio.ru/ru/blog/inspections/) о проверке различных проектов\. Так что перейдем к делу и попробуем найти ошибки в исходном коде парсера от Google\.

К нашему сожалению, и, к радости всех остальных, каких\-либо ошибок найти не удалось\. Найдена только пара несущественных недочётов, о которых мы и расскажем\. Надо ведь хоть про что\-то написать :\)\. Отсутствие ошибок объясняется малым объёмом проекта и высоким качеством самого кода\. Это не значит, что там не прячутся какие\-то ошибки, но статический анализ оказался в данный момент бессилен\.

В общем эта статья получилась в духе другой нашей публикации "[Самая короткая статья о проверке nginx](https://pvs-studio.ru/ru/blog/posts/0246/)"\.

Нашлась возможность небольшой оптимизации:

[V805](https://pvs-studio.ru/ru/docs/warnings/v805/) Decreased performance\. It is inefficient to identify an empty string by using 'strlen\(str\) \> 0' construct\. A more efficient way is to check: str\[0\] \!\= '\\0'\. robots\.cc 354

```cpp
bool RobotsTxtParser::GetKeyAndValueFrom(char **key, ....)
{
  ....  
  *key = line;
  ....
  if (strlen(*key) > 0) {
    ....
    return true;
  }
  return false;
}
```

Вызов функции _strlen_ для того, чтобы узнать, является ли строка непустой \- это неэффективный способ\. Такую проверку можно произвести гораздо проще: _if \(\*key\[0\] \!\= '\\0'\)_, и не нужно будет проходить по всем элементам строки, если она непустая\.



[V808](https://pvs-studio.ru/ru/docs/warnings/v808/) 'path' object of 'basic\_string' type was created but was not utilized\. robots\.cc 123

```cpp

std::string GetPathParamsQuery(....)
{
  std::string path;
  ....
}
```

Строка _path_ объявляется, но далее не используется\. В некоторых случаях неиспользованные переменные могут указывать на ошибку\. Но тут похоже на то, что раньше эта переменная как\-то использовалась, но после внесения изменений стала не нужна\. Таким образом, анализатор зачастую еще и помогает сделать код чище и помочь избежать ошибок, попросту убрав предпосылки для их появления\.

В следующем случае анализатор, по сути, дает рекомендацию добавить дефолтный _return_ после того, как весь _main_ будет отработан\. Возможно, стоило бы добавить _return_ в самом конце, чтобы можно было понять, что все действительно отработало\. Однако если данное поведение и было задумано, и изменять ничего не нужно, а сообщение анализатора видеть бы не хотелось, то в случае PVS\-Studio можно подавить это предупреждение и никогда его больше не видеть :\)\.

[V591](https://pvs-studio.ru/ru/docs/warnings/v591/) The 'main' function does not return a value, which is equivalent to 'return 0'\. It is possible that this is an unintended behavior\.  robots\_main\.cc 99

```cpp
int main(int argc, char** argv)
{
  ....
  if (filename == "-h" || filename == "-help" || filename == "--help")
  {
    ShowHelp(argc, argv);
    return 0;
  }
  if (argc != 4)
  {
    ....
    return 1;
  }
  if (....)
  {
    ....
    return 1;
  }
  ....
  if (....)
  {
    std::cout << "...." << std::endl;
  }
}
```

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

[V524](https://pvs-studio.ru/ru/docs/warnings/v524/) It is odd that the body of 'MatchDisallow' function is fully equivalent to the body of 'MatchAllow' function\. robots\.cc 645

```cpp
int MatchAllow(absl::string_view path, absl::string_view pattern)
{
  return Matches(path, pattern) ? pattern.length() : -1;
}

int MatchDisallow(absl::string_view path, absl::string_view pattern)
{
  return Matches(path, pattern) ? pattern.length() : -1;
}
```

Это единственное место, которое вызывает у меня какое\-то подозрение\. Его стоит проверить авторам проекта\.

Таким образом, проверка парсера robots\.txt от Google показала, что столь активно используемый и, скорее всего, многократно проверенный на ошибки проект, имеет высокое качество кода\. А найденные недочеты совсем не могут испортить впечатление от того, какие крутые кодеры из Google занимались этим проектом :\)\.

Предлагаем и вам [скачать и попробовать PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/download/) на интересующем вас проекте\.