Хабрахабр

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

Picture 1

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

Он действует для протоколов https, http и FTP. robots.txt – индексный файл, который содержит правила для поисковых роботов. Подробнее об этой новости можно почитать здесь: Google открывает исходный код парсера robots.txt
Думаю, большинству читающих наши статьи известно, что делает PVS-Studio. Google сделала доступным для всех свой парсер файла robots.txt. PVS-Studio – статический анализатор кода, который позволяет находить разнообразные ошибки, уязвимости и недочеты в проектах, написанных на С, С++, С# и Java. Но на случай, если вы впервые в нашем блоге, дадим краткую справку. А ещё команда PVS-Studio очень любит писать статьи о проверке различных проектов. Другими словами, PVS-Studio является SAST решением и может работать как на пользовательских машинах или сборочных серверах, так и в облаке. Так что перейдем к делу и попробуем найти ошибки в исходном коде парсера от Google.

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

В общем эта статья получилась в духе другой нашей публикации "Самая короткая статья о проверке nginx".

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

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

bool RobotsTxtParser::GetKeyAndValueFrom(char **key, ....)
return false;
}

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

robots.cc 123 V808 'path' object of 'basic_string' type was created but was not utilized.

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

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

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

It is possible that this is an unintended behavior. V591 The 'main' function does not return a value, which is equivalent to 'return 0'. robots_main.cc 99

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; }
}

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

robots.cc 645 V524 It is odd that the body of 'MatchDisallow' function is fully equivalent to the body of 'MatchAllow' function.

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;
}

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

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

Предлагаем и вам скачать и попробовать PVS-Studio на интересующем вас проекте.

PVS-Studio wanted but couldn't find bugs in robots.txt Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Victoria Khanieva.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть