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

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

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

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

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

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

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


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

>
>
Примеры ошибок, обнаруженных с помощью …

Примеры ошибок, обнаруженных с помощью диагностики V510

05 Апр 2021

V510. The 'Foo' function is not expected to receive class-type variable as 'N' actual argument.


C++ Embedded Web Server

V510 The 'printf' function is not expected to receive class-type variable as second actual argument. Examples SQLiteDatabase.cpp 39


wstring myDBFName;
....
void CSQLiteDatabase::Open()
{
  int rc = sqlite3_open16(myDBFName.c_str(), &db);
  if( rc ) {
    printf("Cannot open database %s",myDBFName);
    exit(1);
  }
}

1) wprintf should be used. 2) .c_str() is missing.


SMTP Client

V510 The 'sprintf' function is not expected to receive class-type variable as third actual argument. CSmtp csmtp.cpp 809


bool CSmtp::ConnectRemoteServer(....)
{
  ....
  std::string encoded_login =
    base64_encode(ustrLogin, strlen(SendBuf));
  ....
  sprintf(SendBuf, "AUTH PLAIN %s",
    encoded_login);
  ....
}

This is what should have been written here: sprintf(SendBuf, "AUTH PLAIN %s", encoded_login.c_str());


TortoiseSVN

V510 The 'printf_s' function is not expected to receive class-type variable as fourth actual argument. excprpt.cpp 199


string CExceptionReport::getCrashLog()
{
  ....
  _tprintf_s(buf, _T("%s\\%s.xml"),
    getenv("TEMP"), CUtility::getAppName());
  ....
}

The V510 message warns you that it's a bad idea to pass a parameter of the std::string type into the printf_s function. And it is std::string that the CUtility::getAppName() function returns. The error is this: the programmer forgot to write ".c_str()". It may result both in incorrect data output and program crash.


WinMerge

V510 The 'Format' function is not expected to receive class-type variable as 'N' actual argument. stdafx.xpp 110


String GetSysError(int nerr);
....
CString msg;
msg.Format(
_T("Failed to open registry key HKCU/%s:\n\t%d : %s"),
f_RegDir, retVal, GetSysError(retVal));

Everything looks fine at the first sight. But the "String" type is nothing but "std::wstring". Therefore, we will get some gibberish printed at best and an Access Violation error at worst. An object of the "std::wstring" type is placed instead of the string pointer into the stack. The correct code should contain a call of c_str():


Quake-III-Arena

V510 The 'ScriptError' function is not expected to receive class-type variable as third actual argument. botlib l_script.c 992


typedef struct punctuation_s
{
  char *p;
  int n;
  struct punctuation_s *next;
} punctuation_t;

punctuation_t *punctuations;

int PS_ExpectTokenType(
  script_t *script, int type, int subtype, token_t *token)
{
  ....
  ScriptError(script, "expected %s, found %s",
    script->punctuations[subtype], token->string);
  ....
}

Similar errors can be found in some other places:

  • V510 The 'Com_Printf' function is not expected to receive class-type variable as third actual argument. quake3 win_input.c 1134

WinMerge

V510 The 'Write' function is not expected to receive class-type variable as sixth actual argument. Merge dirscan.cpp 565


static void StoreDiffData(DIFFITEM &di, CDiffContext * pCtxt,
  const FolderCmp * pCmpData)
{
  ....
  GetLog()->Write
  (
    CLogFile::LCOMPAREDATA,
    _T("name=<%s>, leftdir=<%s>, rightdir=<%s>, code=%d"),
    di.left.filename.c_str(),
    di.left.path.c_str(),
    di.right.path.c_str(),
    di.diffcode
  );
  pCtxt->m_pCompareStats->AddItem(di.diffcode.diffcode);
  ....
}

'di.diffcode' is class object. Most likely this is what should be written here: di.diffcode.diffcode.


WinMerge

V510 The 'Write' function is not expected to receive class-type variable as second actual argument. Merge logfile.cpp 85


std::wstring m_strLogPath;

void CLogFile::EnableLogging(BOOL bEnable)
{
  ....
  Write(_T("Path: %s\n*******\n"), m_strLogPath);
  ....
}

This is what should have been written here: m_strLogPath.c_str()


TortoiseSVN

V510 The 'operator()' function is not expected to receive class-type variable as second actual argument. svnfolderstatus.cpp 150


class CTSVNPath
{
  ....
private:
  mutable CString m_sBackslashPath;
  mutable CString m_sLongBackslashPath;
  mutable CString m_sFwdslashPath;
  ....
};

const FileStatusCacheEntry * SVNFolderStatus::BuildCache(
  const CTSVNPath& filepath, ....)
{
  ....
  CTraceToOutputDebugString::Instance() (_T(__FUNCTION__)
    _T(": building cache for %s\n"), filepath);
  ....
}

Similar errors can be found in some other places:

  • V510 The 'operator()' function is not expected to receive class-type variable as second actual argument. svnfolderstatus.cpp 355
  • V510 The 'operator()' function is not expected to receive class-type variable as second actual argument. svnfolderstatus.cpp 360

Wild Magic 5

V510 The 'Assert' function is not expected to receive class-type variable as fifth actual argument. wm5terrain.cpp 150


void Terrain::LoadHeader (const std::string& heightName)
{
  ....
  std::string fileName = heightName + ".wmhf";
  FileIO header(fileName, mMode);
  assertion(header, "Cannot open file %s\n", fileName);
  ....
}

Similar errors can be found in some other places:

  • V510 The 'Assert' function is not expected to receive class-type variable as fifth actual argument. wm5terrain.cpp 173

Scilab

V510 The 'fprintf' function is not expected to receive class-type variable as fourth actual argument. jvm.c 247


typedef struct JavaVMOption {
    char *optionString;
    void *extraInfo;
} JavaVMOption;

JavaVMOption *options;

BOOL startJVM(char *SCI_PATH)
{
  ....
  fprintf(stderr, "%d: %s\n", j, vm_args.options[j]);
  ....
}

However, the fprintf() function will actually take an object of the JavaVMOption type as an argument. The code works only thanks to wonderful and lucky coincidence. Firstly, the 'optionString' member is located in the beginning of the structure. That's why it is this particular member that the fprintf() function will take and handle as a pointer to the string. Secondly, the function will not print anything after that, therefore no garbage will be printed too (i.e. the contents of the 'extraInfo' variable that will also get into the stack).


Unreal Engine 4

V510 The 'EnsureNotFalseFormatted' function is not expected to receive class-type variable as sixth actual argument. slategameresources.cpp 49


const FSlateBrush* FSlateGameResources::GetBrush(
  const FName PropertyName, ....)
{
  ....
  ensureMsgf(BrushAsset, TEXT("Could not find resource '%s'"),
             PropertyName);
  ....
}

Chromium

V510 The 'AtlTrace' function is not expected to receive class-type variable as third actual argument. delegate_execute.cc 96


typedef std::wstring string16;

const base::string16& relaunch_flags() const {
  return relaunch_flags_;
}

int RelaunchChrome(const DelegateExecuteOperation& operation)
{
  AtlTrace("Relaunching [%ls] with flags [%s]\n",
           operation.mutex().c_str(),
           operation.relaunch_flags());     // <=
  ....
}

Similar errors can be found in some other places:

  • V510 The 'Trace' function is not expected to receive class-type variable as fourth actual argument. entry_impl_v3.cc 1394
  • V510 The 'StringPrintf' function is not expected to receive class-type variable as second actual argument. gcapi_last_run_test.cc 29

Unreal Engine 4

V510 The 'Errorf' function is not expected to receive class-type variable as second actual argument. materialexpressionlandscapelayerblend.cpp 241


int32 UMaterialExpressionLandscapeLayerBlend::Compile(....)
{
  ....
  Compiler->Errorf(TEXT("...."), Layers[LayerIdx].LayerName);
  ....
}

Apple II emulator

V510 The 'sprintf' function is not expected to receive class-type variable as fifth actual argument. debug.cpp 2300


struct Command_t
{
  char         m_sName[ MAX_COMMAND_LEN ];
  CmdFuncPtr_t pFunction;
  int          iCommand;
  char        *pHelpSummary;
};

extern Command_t g_aParameters[];

void ConfigSave_PrepareHeader ( .... )
{
  char sText[ CONSOLE_WIDTH ];

  sprintf( sText, "%s %s = %s\n"
    , g_aTokens[ TOKEN_COMMENT_EOL  ].sToken
    , g_aParameters[ PARAM_CATEGORY ].m_sName
    , g_aParameters[ eCategory ]
    );
  ....
}

In the capacity of last parameter it is necessary to use this expressin: g_aParameters[ eCategory ].m_sName.


Telegram

V510 The 'wsprintfW' function is not expected to receive class-type variable as third actual argument. Updater updater.cpp 255


bool update()
{
  ....
  wstring fname = from[i], tofname = to[i];
  ....
  WCHAR errMsg[2048];
  ....
  wsprintf(errMsg, L"Failed to update Telegram :
                 (\n%s is not accessible.", tofname);
  ....
}

Computational Network Toolkit

V510 The 'sprintf_s' function is not expected to receive class-type variable as third actual argument. binaryfile.cpp 501


const std::wstring& GetName()
{
  return m_name;
}

Section* Section::ReadSection(....)
{
  ....
  char message[256];
  sprintf_s(message,"Invalid header in file %ls, in header %s\n",
              m_file->GetName(), section->GetName());       // <=
  RuntimeError(message);
  ....
}

CryEngine V

V510 The 'LogError' function is not expected to receive class-type variable as second actual argument. behaviortreenodes_action.cpp 143


typedef CryStringT<char> string;
// The actual fragment name.
string m_fragName;
//! cast to C string.
const value_type* c_str() const { return m_str; }
const value_type* data() const  { return m_str; };

void LogError(const char* format, ...) const
{ .... }

void QueueAction(const UpdateContext& context)
{
  ....
  ErrorReporter(*this, context).LogError("....'%s'", m_fragName);
  ....
}

Similar errors can be found in some other places:

  • V510 The 'LogError' function is not expected to receive class-type variable as second actual argument. behaviortreenodes_core.cpp 1339
  • V510 The 'Format' function is not expected to receive class-type variable as second actual argument. behaviortreenodes_core.cpp 2648
  • V510 The 'CryWarning' function is not expected to receive class-type variable as sixth actual argument. crypak.cpp 3324
  • And 4 additional diagnostic messages.

Scilab

V510 The 'Scierror' function is not expected to receive class-type variable as third actual argument. sci_winqueryreg.cpp 149


const std::string fname = "winqueryreg";

types::Function::ReturnValue sci_winqueryreg(....)
{
  ....
  if (rhs != 2 && rhs != 3)
  {
    Scierror(77, _("%s: Wrong number...\n"), fname.data(), 2, 3);
    return types::Function::Error;
  }
  ....
  else
  {
    Scierror(999, _("%s: Cannot open Windows regist..."), fname);
    return types::Function::Error;
  }
  ....
}

libusbx

V510 CWE-686 The '_snprintf' function is not expected to receive class-type variable as fourth actual argument. format.h 97


void usbi_log(struct libusb_context *ctx,
              enum libusb_log_level level,
              const char *function,
              const char *format, ...);

#define _usbi_log(ctx, level, ...) \
  usbi_log(ctx, level, __FUNCTION__, __VA_ARGS__)

#define usbi_err(ctx, ...) \
  _usbi_log(ctx, LIBUSB_LOG_LEVEL_ERROR, __VA_ARGS__)

struct pollfd {
  int fd;           /* file descriptor */
  short events;     /* requested events */
  short revents;    /* returned events */
};

static int windows_handle_events(...., struct pollfd *fds, ....)
{
  ....
  usbi_err(ctx, "could not find a matching transfer for fd %x",
           fds[i]);
  ....
}

A %X specifier in the format string shows the intention to print an integer value. However, the entire structure is passed to the function. Most likely, the code here is supposed to be as follows: usbi_err(ctx, "...... transfer for fd %x", fds[i].fd);


Популярные статьи по теме
Как PVS-Studio оказался внимательнее, чем три с половиной программиста

Дата: 22 Окт 2018

Автор: Андрей Карпов

PVS-Studio, как и другие статические анализаторы кода, часто выдаёт ложные срабатывания. Но не стоит спешить считать странные срабатывания ложными. Это короткая история о том, как PVS-Studio вновь ок…
PVS-Studio для Java

Дата: 17 Янв 2019

Автор: Андрей Карпов

В седьмой версии статического анализатора PVS-Studio мы добавили поддержку языка Java. Пришло время немного рассказать, как мы начинали делать поддержку языка Java, что у нас получилось и какие дальн…
Зло живёт в функциях сравнения

Дата: 19 Май 2017

Автор: Андрей Карпов

Возможно, читатели помнят мою статью под названием "Эффект последней строки". В ней идёт речь о замеченной мной закономерности: ошибка чаще всего допускается в последней строке однотипных блоков текс…
Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний

Дата: 31 Июл 2017

Автор: Андрей Карпов

После большой статьи про проверку операционной системы Tizen мне было задано много вопросов о проценте ложных срабатываний и о плотности ошибок (сколько ошибок PVS-Studio выявляет на 1000 строк кода)…
PVS-Studio ROI

Дата: 30 Янв 2019

Автор: Андрей Карпов

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

Дата: 21 Ноя 2018

Автор: Андрей Карпов

Краткое описание технологий, используемых в инструменте PVS-Studio, которые позволяют эффективно обнаруживать большое количество паттернов ошибок и потенциальных уязвимостей. Статья описывает реализа…
Как и почему статические анализаторы борются с ложными срабатываниями

Дата: 20 Мар 2017

Автор: Андрей Карпов

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…
Любите статический анализ кода!

Дата: 16 Окт 2017

Автор: Андрей Карпов

Я в шоке от возможностей статического анализа кода, хотя сам участвую в разработке инструмента PVS-Studio. На днях я был искренне удивлён тому, что анализатор оказался умнее и внимательнее меня.
Статический анализ как часть процесса разработки Unreal Engine

Дата: 27 Июн 2017

Автор: Андрей Карпов

Проект Unreal Engine развивается - добавляется новый код и изменятся уже написанный. Неизбежное следствие развития проекта - появление в коде новых ошибок, которые желательно выявлять как можно раньш…
Бесплатный PVS-Studio для тех, кто развивает открытые проекты

Дата: 22 Дек 2018

Автор: Андрей Карпов

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub, GitLab или Bitbucket. Им предоставляется возмо…

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

Следующие комментарии

На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять