我的程序在尝试复制未以 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/