【问题标题】:Run-Time Check Failure #2 - Stack around the variable 'ex' was corrupted运行时检查失败 #2 - 变量“ex”周围的堆栈已损坏
【发布时间】:2014-07-01 06:00:47
【问题描述】:

我得到运行时异常;

运行时检查失败 #2 - 变量“ex”周围的堆栈已损坏。

下面的代码。

DBConnPtr CDBConnector::GetConnectionInstance()
{
    if (m_pConn)
       return m_pConn;

    if (m_loginInfo.hostName.IsEmpty() || 
        m_loginInfo.portNumber == 0 || 
        m_loginInfo.userName.IsEmpty())
      return m_pConn;

    CString hostInfo(_T(""));
    hostInfo.Format("tcp://%s:%d", m_loginInfo.hostName, m_loginInfo.portNumber);
    sql::SQLString host = hostInfo;
    sql::SQLString user = m_loginInfo.userName;
    sql::SQLString pwd = m_loginInfo.userPwd;

    try
    {
        sql::Driver* pDriver = get_driver_instance();
        m_pConn = (DBConnPtr)pDriver->connect(host, user, pwd);
    }
    catch (sql::SQLException ex)
    {
    }
    //mysql_thread_end();

    return m_pConn;
}

在将sql::SQLString pwd = m_loginInfo.userPwd;移出try块之前,它曾经抛出

运行时检查失败 #2 - 变量“pwd”周围的堆栈已损坏。

任何想法为什么? 我正在使用 mysql 库并试图捕获在 connect 调用时发生的 SQLException。

编辑

将每个 CString 类型转换为 LPCTSTR 后的输出窗口:

MyApp.exe 中 0x75B61D4D 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0493F8C0 处的 sql::SQLException。
MyApp.exe 中 0x75B61D4D 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0493F8C0 处的 sql::SQLException。
MyApp.exe 中 0x005E18A5 处未处理的异常:堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出。

【问题讨论】:

  • 来自m_loginInfo.hostName.IsEmpty() 我得出结论m_loginInfo.hostNameCString 类型。 CStrings 必须在传递给 CString::Format 之前显式转换为 LPCTSTR。不过,我看不出这会如何破坏堆栈。您可以查看get_driver_instance 来查找原因。

标签: c++ mysql runtime-error stack-corruption


【解决方案1】:

正如MSDN 指出的那样:当您将字符串作为可选参数传递时,您必须将其显式转换为 LPCTSTR。

另外,这个article 指出了如果你不这样做的后果。

如果 SQLString 类型可以转换为 LPCTSTR,请更改此行:

hostInfo.Format("tcp://%s:%d", m_loginInfo.hostName, m_loginInfo.portNumber);

到:

hostInfo.Format(_T("tcp://%s:%d"), LPCTSTR(m_loginInfo.hostName), LPCTSTR(m_loginInfo.portNumber));

【讨论】:

  • 如果 TCHAR 被定义为 WCHAR,它根本不会编译。
  • 这次出现不同的错误; Stack cookie instrumentation code detected a stack-based buffer overrun. 类型转换后。 @AndreyChernyakhovskiy
  • 您应该确保可以先转换 SQLString。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2013-12-13
  • 2013-12-10
  • 2015-02-09
  • 2015-05-24
  • 2021-12-31
  • 2014-10-20
相关资源
最近更新 更多