Для получения триального ключа
заполните форму ниже
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

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

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

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

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

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

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


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Проверка открытого проекта WinSCP, разр…

Проверка открытого проекта WinSCP, разрабатываемого в Embarcadero C++ Builder

24 Апр 2014

Мы постоянно проверяем открытые проекты на языке Си/Си++. Но почти всегда, это проекты, разрабатываемые в Visual Studio. А вот Embarcadero C++ Builder мы как-то обделили вниманием. Нужно исправляться и сегодня мы проверили проект WinSCP.

Поддержка C++ Builder была прекращена в PVS-Studio после версии 5.20. По всем возникшим вопросам вы можете обратиться в нашу поддержку.

0252_WinSCP_ru/image1.png

WinSCP

WinSCP – свободный графический клиент протоколов SFTP и SCP, предназначенный для Windows. Распространяется по лицензии GNU GPL. Обеспечивает защищённое копирование файлов между компьютером и серверами, поддерживающими эти протоколы.

Официальный сайт: http://winscp.net

Для сборки проекта необходим Embarcadero C++ Builder XE2.

Проверка

Проверка осуществлялась с помощью анализатора PVS-Studio. На данный момент PVS-Studio поддерживает:

  • Visual Studio 2013 C, C++, C++11, C++/CX (WinRT)
  • Visual Studio 2012 C, C++, C++11, C++/CX (WinRT)
  • Visual Studio 2010 C, C++, C++0x
  • Visual Studio 2008 C, C++
  • Visual Studio 2005 C, C++
  • Embarcadero RAD Studio XE5 C, C++, C++11, 64-bit compiler included
  • Embarcadero RAD Studio XE4 C, C++, C++11, 64-bit compiler included
  • Embarcadero RAD Studio XE3 Update 1 C, C++, C++11, 64-bit compiler included
  • Embarcadero RAD Studio XE2 C, C++, C++0x
  • Embarcadero RAD Studio XE C, C++
  • Embarcadero RAD Studio 2010 C, C++
  • Embarcadero RAD Studio 2009 C, C++
  • MinGW C, C++, C++11

Плюс вы можете запустить PVS-Studio Standalone. Он позволяет проверять заранее подготовленные *.i файлы или отслеживать процесс сборки проекта и собирать всю необходимую для проверки информацию. Подробности можно узнать здесь: "PVS-Studio теперь поддерживает любую сборочную систему".

Результаты проверки

Ошибок нашлось не много, но достаточно, чтобы написать эту статью и привлечь внимание пользователей Embarcadero RAD Studio.

Перепутаны аргументы функции memset()

TForm * __fastcall TMessageForm::Create(....)
{
  ....
  LOGFONT AFont;
  ....   
  memset(&AFont, sizeof(AFont), 0);
  ....
}

Предупреждение PVS-Studio: V575 The 'memset' function processes '0' elements. Inspect the third argument. messagedlg.cpp 786

Функция memset() принимает размер массива в третьем аргументе. Простая, но неприятная опечатка. Структура остаётся неинициализированной.

Ниже в коде имеется ещё одна идентичная опечатка: messagedlg.cpp 796

Использование несуществующего объекта

void __fastcall TCustomScpExplorerForm::EditorAutoConfig()
{
  ....
  else
  {
    ....
    TEditorList EditorList;
    EditorList = *WinConfiguration->EditorList;
    EditorList.Insert(0, new TEditorPreferences(EditorData));
    WinConfiguration->EditorList = &EditorList;
  }
  ....
}

Предупреждение PVS-Studio: V506 Pointer to local variable 'EditorList' is stored outside the scope of this variable. Such a pointer will become invalid. customscpexplorer.cpp 2633

Объект 'EditorList' будет уничтожен сразу после выхода из области видимости. Однако, в программе сохраняют указатель на этот объект и затем используют. Это приводит к неопределённому поведению.

Мусор в диалоге

bool __fastcall RecursiveDeleteFile(....)
{
  SHFILEOPSTRUCT Data;
  memset(&Data, 0, sizeof(Data));
  ....
  Data.pTo = L"";
  ....
}

Предупреждение PVS-Studio: V540 Member 'pTo' should point to string terminated by two 0 characters. common.cpp 1659

Обратите внимание на следующую строку в описании параметра pTo в MSDN: "Note This string must be double-null terminated".

Из-за ошибки в диалоге для работы с файлом будет содержаться мусор. Или не будет. Всё зависит от везения. Но код в любом случае неправилен.

Продублированная строка

int CFileZillaApi::Init(....)
{
  ....
  m_pMainThread->m_hOwnerWnd=m_hOwnerWnd;
  m_pMainThread->m_hOwnerWnd=m_hOwnerWnd;
  ....
}

Предупреждение PVS-Studio: V519 The 'm_pMainThread->m_hOwnerWnd' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 88, 89. filezillaapi.cpp 89

Возможно, здесь нет никакой ошибки. Просто одна строка лишняя.

Неработающая проверка

STDMETHODIMP CShellExtClassFactory::CreateInstance(....)
{
  ....
  CShellExt* ShellExt = new CShellExt();
  if (NULL == ShellExt)
  {
    return E_OUTOFMEMORY;
  }
  ....
}

Предупреждение PVS-Studio: V668 There is no sense in testing the 'ShellExt' pointer against null, as the memory was allocated using the 'new' operator. The exception will be generated in the case of memory allocation error. dragext.cpp 554

Проверка "if (NULL == ShellExt)" не имеет смысла, так как если не удастся выделить память, то оператор 'new' сгенерирует исключение std::bad_alloc.

Опасный способ использования функции fprintf()

bool CAsyncSslSocketLayer::CreateSslCertificate(....)
{
  ....
  char buffer[1001];
  int len;
  while ((len = pBIO_read(bio, buffer, 1000)) > 0)
  {
    buffer[len] = 0;
    fprintf(file, buffer);
  }
  ....
}

V618 It's dangerous to call the 'fprintf' function in such a manner, as the line being passed could contain format specification. The example of the safe code: printf("%s", str); asyncsslsocketlayer.cpp 2247

Если при записи в файл, в буфере будут содержаться управляющие спецификаторы, то результат окажется непредсказуемым. Безопасный способ:

fprintf(file, "%s", buffer);

Вообще, эту ошибку можно считать потенциальной уязвимостью.

Что-то не так с переменной 'err'

static error_t
client_send_propfind_request(....)
{
  ....
  error_t err = 0;
  int code = 0;

  apr_hash_t * props = NULL;
  const char * target = path_uri_encode(remote_path, pool);
  char * url_path = apr_pstrdup(pool, target);

  WEBDAV_ERR(neon_get_props(&props, ras, url_path,
    NEON_DEPTH_ZERO, starting_props,
    false, pool));

  if (err && (err == WEBDAV_ERR_DAV_REQUEST_FAILED))
  ....
}

Предупреждение: V560 A part of conditional expression is always false: (err == 1003). webdavfilesystem.cpp 10990

Заключение

Где вы, программисты, использующие Embarcadero RAD Studio? Ау! Как показывает наша статистика, их почти нет. Приходите и попробуйте анализатор кода PVS-Studio!

Популярные статьи по теме
Интервью с Джейсоном Тернером, одним из ведущих подкаста "CppCast": история и причины закрытия проекта

Дата: 27 Сен 2022

Автор: Ульяна Гришина

В этой статье мы поговорим с Джейсоном Тернером, одним из основателей CppCast. CppCast – это первый С++ подкаст, основанный С++ разработчиками. Начиная с 2015 года каждую неделю на CppCast выходили п…
Боремся с 16-летним легаси-кодом, или исправляем C и C++ front-end в PVS-Studio

Дата: 22 Сен 2022

Автор: Сергей Ларин

В 2022 году статическому анализатору PVS-Studio для языков C и C++ исполняется 16 лет. Если бы анализатор был человеком, то он бы уже заканчивал школу. Это очень старый проект, и система типов в нем …
Как фидбек помог улучшить наш C++ квиз

Дата: 31 Авг 2022

Автор: Алексей Саркисов

Ранее в нашем блоге мы рассказывали о квизе для C++ разработчиков. С момента запуска мы тщательно собирали обратную связь. Часть из неё касалась ошибок в работе квиза, которые мы естественно решили и…
Концепция умного указателя static_ptr<T> в C++

Дата: 30 Авг 2022

Автор: Гость

В C++ есть несколько "умных указателей" – 'std::unique_ptr', 'std::shared_ptr', 'std::weak_ptr'.
"Так исторически сложилось", или за что разделили V512

Дата: 12 Авг 2022

Автор: Михаил Гельвих

Как говорится, в любом деле самое сложное — это начать. Так и мы, очень долго откладывали разделение диагностики V512, но время пришло. Ну а о причинах и последствиях этого решения можно прочитать в …

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

Следующие комментарии
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно. Хотите узнать подробнее?
Принять