Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
Всего пара багов на 514K строках кода -…

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

03 Мар 2016

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

0378_AmazonSDK_ru/image1.png

Проект AWS SDK для языка C++ - полноценно работающая программа с интерфейсами низкого и высокого уровня и минимальным количеством зависимостей. Инструментом проверки послужил статический анализатор PVS-Studio, выявляющий ошибки в исходном коде программ, написанных на языках С, C++ и C#.

Размер проекта AWS SDK - 5415 файлов, которые содержат более 514 тысяч строк. Обычно в проектах такого размера обнаруживается огромное количество багов разного уровня важности, что нас весьма радует и существенно пополняет нашу копилку ошибок.

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

V547 Expression 'pathname_.c_str() == 0' is always false. Pointer 'pathname_.c_str()' != NULL. gtest-all.cc 8189

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_" является пустой. Тогда проверка должна быть такой:

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+ открытых проектов, мы более чем удивлены увидеть столь малое количество ошибок. Так держать, Amazon!

Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам