﻿# Всего пара багов на 514K строках кода \- Amazon Web Services SDK на языке C\+\+

Amazon Web Services открыл доступ к исходному коду C\+\+ SDK, который представляет собой современный интерфейс с достаточно простыми зависимостями\. Наша команда решила посмотреть, что интересного может найти статический анализатор PVS\-Studio в этом коде\. 

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

Проект AWS SDK для языка C\+\+ \- полноценно работающая программа с интерфейсами низкого и высокого уровня и минимальным количеством зависимостей\. Инструментом проверки послужил  статический анализатор [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/), выявляющий ошибки в исходном коде программ, написанных на языках С, C\+\+ и C\#\.

Размер проекта AWS SDK \- 5415 файлов, которые содержат более 514 тысяч строк\. Обычно в проектах такого размера обнаруживается огромное количество багов разного уровня важности, что нас весьма радует и существенно пополняет нашу [копилку ошибок](https://pvs-studio.ru/ru/blog/examples/)\. 

На этот раз нам нечего сказать\. Мы можем только дружно поаплодировать команде AWS разработчиков за такой качественный код\. Анализатор смог обнаружить всего пару багов, и те не являются критическими\. Вот их описание, приводим вместе с предупреждениями анализатора: 

[V547](https://pvs-studio.ru/ru/docs/warnings/v547/) Expression 'pathname\_\.c\_str\(\) \=\= 0' is always false\. Pointer 'pathname\_\.c\_str\(\)' \!\= NULL\. gtest\-all\.cc 8189

```cpp
std::string pathname_;
void FilePath::Normalize() {
  if (pathname_.c_str() == NULL) {  // <=
    pathname_ = "";
    return;
  }
  const char* src = pathname_.c_str();
  char* const dest = new char[pathname_.length() + 1];
  ....
}
```

Функция string::c\_str\(\) возвращает указатель , который не может быть равен NULL\. Даже если будет создана пустая строка, например, "string buf;", то функция "buf\.c\_str\(\)" вернёт валидный указатель на пустую строку\. 

Таким образом, условие "pathname\_\.c\_str\(\) \=\= NULL" всегда будет ложным и выход из функции никогда не выполнится в этом месте\. Скорее всего, из функции необходимо выйти, если строка "pathname\_" является пустой\. Тогда проверка должна быть такой:

```cpp
std::string pathname_;
void FilePath::Normalize() {
  if (pathname_.empty()) {
    return;
  }
  ....
}
```

Ещё два похожих места:

* V547 Expression 'output\_file\_\.c\_str\(\) \=\= 0' is always false\. Pointer 'output\_file\_\.c\_str\(\)' \!\= NULL\. gtest\-all\.cc 4575
* V547 Expression 'os\_stack\_trace\.c\_str\(\) \!\= 0' is always true\. Pointer 'os\_stack\_trace\.c\_str\(\)' \!\= NULL\. gtest\-all\.cc 5286

На этом всё\! Всего пара подозрительных фрагментов на полмиллиона строк\. Было еще несколько моментов, которые показались нам немного странными, но на примеры ошибок они явно не тянут\. Это и правда впечатляет\. Признаемся, после проверки [200\+ открытых проектов](https://pvs-studio.ru/ru/blog/inspections/), мы более чем удивлены увидеть столь малое количество ошибок\. Так держать, Amazon\!