【发布时间】:2012-01-16 19:29:18
【问题描述】:
在 C++ 标准库中有 exact 等效于 strncpy 吗?我的意思是一个函数,它将一个字符串从一个缓冲区复制到另一个缓冲区,直到它到达终止 0?例如,当我必须解析来自不安全来源(例如 TCP 数据包)的字符串时,我可以在处理数据时执行长度检查。
我已经搜索了很多关于这个主题的内容,也发现了一些有趣的主题,但是所有这些人都对 std::string::assign 感到满意,它还能够将要复制的字符大小作为参数.我对这个函数的问题是,如果终止 null 已经被命中,它不会执行任何检查 - 它会认真对待给定的大小并将数据复制到 memcpy 将其复制到字符串的缓冲区中.这样,如果在应对时进行了这样的检查,则分配和复制的内存比必须完成的要多得多。
这就是我目前解决此问题的方式,但我希望避免一些开销:
// Get RVA of export name
const ExportDirectory_t *pED = (const ExportDirectory_t*)rva2ptr(exportRVA);
sSRA nameSra = rva2sra(pED->Name);
// Copy it into my buffer
char *szExportName = new char[nameSra.numBytesToSectionsEnd];
strncpy(szExportName,
nameSra.pSection->pRawData->constPtr<char>(nameSra.offset),
nameSra.numBytesToSectionsEnd);
szExportName[nameSra.numBytesToSectionsEnd - 1] = 0;
m_exportName = szExportName;
delete [] szExportName;
这段代码是我的 PE 二进制文件解析器的一部分(准确地说,是解析导出表的例程)。 rva2sra 将相对虚拟地址转换为 PE 段相对地址。 ExportDirectory_t 结构包含二进制文件导出名称的 RVA,它应该是一个以零结尾的字符串。但情况并非总是如此 - 如果有人愿意,它可以省略终止零,这会使我的程序运行到不属于该部分的内存中,最终会崩溃(在最好的情况下......)。
自己实现这样的功能问题不大,但如果在 C++ 标准库中实现了解决方案,我会更喜欢它。
【问题讨论】:
-
std::strings 不是以空值结尾的。你想要一个字符串的副本,还是只复制直到第一个空字节(可能存在也可能不存在)的所有内容? -
哦,很高兴知道。我想将所有内容复制到第一个空字节。