为了验证std::字符串是否已损坏,您将执行哪些调试验证
which debug validations would you do in order to verify that your std::string is not corrupted
我怀疑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的ExitProcess
和FatalAppExit
,它们不执行任何特定于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);
。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 正在尝试了解输入验证循环
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 如何在C++中检查2D数组中负值的输入验证
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 在执行时进行输入验证
- 如何验证pthread函数是否开始执行
- 为了验证std::字符串是否已损坏,您将执行哪些调试验证
- 并行执行的 OpenCL 验证
- 无论如何,输入验证都会执行 true
- 是否执行decltype内的表达式,或者只是检查是否验证
- 从可执行文件中读取并验证证书