为了验证std::字符串是否已损坏,您将执行哪些调试验证

which debug validations would you do in order to verify that your std::string is not corrupted

本文关键字:验证 执行 调试 已损坏 std 字符串 是否      更新时间:2023-10-16

我怀疑std::string输入参数由于内存损坏(有时不一致)而损坏

再说一次,我不认为std::string中有错误,我只是怀疑我的代码中有内存损坏,这损坏了我的字符串。

我添加了以下验证功能:

void validate_string(const std::string& inputData)
{
if (inputData.size() > MAXIMUM_ALLOWED_DATA_SIZE)
{ cout << "data is corrupted. size = " << data.size(); exit(1); }
const char* cstr = inputData.c_str();
BOOST_FOREACH(char c, cstr)
{ if (c == 0) {  cout << "data is corrupted. contain NULL"; }}        
}

然而,我在validate_string中没有成功地使程序崩溃,尽管如此,我仍然不相信我的输入字符串没有损坏

当遇到损坏的字符串时,你有什么建议吗?

关于损坏std::string的唯一方法是给它提供无效数据,例如使用初始化

  • 空指针或

  • 扩展到不可寻址区域的C字符串,可能是由悬挂指针引起的。

根据我对他人报告问题的经验,第一种是迄今为止最常见的。

因此,验证data()指针,在您的函数中它将是data.data()(顺便说一句,选择冲突较少的名称如何?)。


如果你真的想"破坏程序",那么有三种方法:

  • 断言不成立的assert和未定义的NDEBUG

  • abort,在没有任何清理的情况下终止,以及

  • std::terminate,如果程序安装了用户定义的处理程序,则通过该处理程序终止,否则通过abort终止。

此外,还有一些特定于操作系统的功能,如Windows的ExitProcessFatalAppExit,它们不执行任何特定于C或C++的清理。

您需要通过isprint:检查字符串的字符

size_t size = s.size();
// check size and internal pointer
if (size > SOME_LARGE_NUMBER || s.c_str() == NULL) {
// corrupted!
}
// check valid chars
for (size_t i = 0; i < size; ++i) {
if(0 == isprint(s[i])) {
// corrupted!
}
}

要停止调试器中的程序,请在窗口中调用DebugBreak()。在Linux中使用raise(SIGTRAP);