Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

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

Anna | 24.06.2014 | нет комментариев
PVS-Studio and WinSP
Мы непрерывно проверяем открытые планы на языке Си/Си . Но примерно неизменно, это планы, разрабатываемые в Visual Studio. А вот Embarcadero C Builder мы как-то обделили вниманием. Необходимо исправляться и сегодня мы проверили план WinSCP.

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!

Эта статья на английском

Если хотите поделиться этой статьей с англоязычной аудиторией, то умоляю применять ссылку на перевод: Andrey Karpov. A Check of the Open-Source Project WinSCP Developed in Embarcadero C Builder .

Прочитали статью и есть вопрос?

Зачастую к нашим статьям задают одни и те же вопросы. Результаты на них мы собрали тут: Результаты на вопросы читателей статей про PVS-Studio и CppCat, версия 2014. Пожалуйста, ознакомьтесь со списком.

 

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB