c++ - 如何防止复制野指针字符串

标签 c++ string mfc crash

我的程序在尝试复制未以 NULL 终止符 ('\0') 结束的字符数组时间歇性崩溃。

class CMenuButton {
   TCHAR m_szNode[32];
   CMenuButton() {
     memset(m_szNode, '\0', sizeof(m_szNode));
   }
};
int main() {
  ....
  CString szTemp = ((CMenuButton*)pButton)->m_szNode; // sometime it crashes here
  ...
  return 0;
}

我怀疑有人没有复制以'\0'结尾的字符,它的结尾是这样的:

            Stack
m_szNode    $%#^&!&!&!*@*#&!(*@(!*@@&#&*&@@!^&*&#(*!@*((*&*SDFKJSHDF*(&(*&(()(**

你能告诉我发生了什么吗?我应该怎么做才能防止复制野指针?非常感谢您的帮助!

我想我无法在复制之前检查字符数组是否为 NULL...

最佳答案

我怀疑您真正的问题可能是 pButton 是一个错误的指针,因此请先检查一下。

要 100% 确定指针正确并指向正确大小/分配的对象的唯一方法是永远不要使用您没有创建的指针,并且永远不要接受/返回指针。相反,您将使用 cookie,并在某种 cookie -> 指针查找(例如哈希表)中查找您的指针。基本上,不要相信用户输入。

如果您更关心发现错误,而不是 100% 安全地防止缓冲区溢出攻击等,那么您可以采取不太激进的方法。在您当前使用指向数组的指针的函数签名中,添加一个大小参数。例如:

void someFunction(char* someString);

成为

void someFunction(char* someString, size_t size_of_buffer);

此外,强制终止函数中的数组/字符串。如果您到达结尾,并且它不是空终止的,则将其截断。

这样你就可以在调用它们时提供缓冲区的大小,而不是在调用它们之前在所有数组上调用 strlen(或等效的)。

这类似于 Microsoft 创建的“安全字符串函数”所采用的方法(其中一些是为标准化而提出的)。不确定这是否是完美的链接,但您可以通过谷歌搜索其他链接:

http://msdn.microsoft.com/en-us/library/ff565508(VS.85).aspx

关于c++ - 如何防止复制野指针字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4011701/

相关文章:

c++ - C++11 中由 std::tuple_size 终止的递归可变参数模板

c++ - 反转 X 轴 OpenGL

C++ libcurl 检查远程文件是否不同

scanf 可以识别字符串中的格式字符吗?

string - 'format'的错误参数#3(预期字符串, bool 值)?

c++ - 转换为 LPCTSTR 时出现文件复制问题

c++ - 在 std 算法中使用 std::move_iterator 并以 lambda 作为 pred 是否安全

java - 在Java中多次检查字符串的结尾?

c++ - 用于 Native C++ 应用程序的 GUI 库

visual-studio-2010 - 如何删除类似 Office 的按钮,但保留功能区?