Examples of errors detected by the V510 diagnostic.


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


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;
  }
  ....
}


Do you make errors in the code?

Check your code
with PVS-Studio

Static code analysis
for C, C++, and C#

goto PVS-Studio;
We use cookies for the analysis of events to improve our content and make user interaction more convenient. By continuing the view of our web-pages you accept the terms of using these files. You can find out more about cookie-files and privacy policy or close the notification, by clicking on the button. Learn More →
Do not show