我编写了一个小型应用程序,该应用程序有时可以处理二进制数据。在单元测试中,我将此数据与预期数据进行比较。发生错误时,我希望测试显示十六进制输出,例如:
Failure
Expected: string_to_hex(expected, 11)
Which is: "01 43 02 01 00 65 6E 74 FA 3E 17"
To be equal to: string_to_hex(writeBuffer, 11)
Which is: "01 43 02 01 00 00 00 00 98 37 DB"
为了显示该信息(并首先比较二进制数据),我使用了the code from Stack Overflow,并根据需要对其进行了一些修改:
std::string string_to_hex(const std::string& input, size_t len)
{
static const char* const lut = "0123456789ABCDEF";
std::string output;
output.reserve(2 * len);
for (size_t i = 0; i < len; ++i)
{
const unsigned char c = input[i];
output.push_back(lut[c >> 4]);
output.push_back(lut[c & 15]);
}
return output;
}
用valgrind
检查内存泄漏时,我发现很多这样的错误:
使用大小为8的未初始化值
在0x11E75A:string_to_hex(std :: __ cxx11 :: basic_string,std :: allocator> const&,unsigned long)
我不确定是否了解。首先,一切似乎都已初始化,包括我误认为output
。而且,在代码中没有提到大小8。 len
的值因测试而异,而valgrind
每次都报告相同的大小8。
我应该如何解决此错误?
答案 0 :(得分:1)
因此,这是将指向char
的指针指向填充有任意二进制数据的缓冲区到std::string
类的邪恶隐式构造函数中的一种情况,这种情况导致字符串被截断为第一个{{ 1}}。简单的方法是传递原始指针,但是更好的解决方案是开始使用\0
array_view
或类似的实用程序类,这些类至少在span
和{的调试版本中提供索引验证{1}}。