C++ 为Valgrind会话设置LD_HWCAP_掩码
在C++ 为Valgrind会话设置LD_HWCAP_掩码,c++,linux,linker,valgrind,stdstring,C++,Linux,Linker,Valgrind,Stdstring,在std::string比较期间,我在Valgrind下捕获到一个未初始化的读取。该程序是在没有-march和-m的情况下构建的,因此我们采用的是仅限SSE2的core-x86_64配置。我们还希望将运行时库限制为SSE2 文档LD\u HWCAP\u MASK,但未提供有关创建MASK的信息。事实上,描述是讨论“面具”的唯一地方 这里有一个类似的问题,但我不太明白发生了什么。我无法想象一个人需要创建源代码补丁,然后重新编译运行库和加载程序来创建硬件掩码。(但我可能遗漏了一些明显的东西) 如何为
std::string
比较期间,我在Valgrind下捕获到一个未初始化的读取。该程序是在没有-march
和-m
的情况下构建的,因此我们采用的是仅限SSE2的core-x86_64配置。我们还希望将运行时库限制为SSE2
文档LD\u HWCAP\u MASK
,但未提供有关创建MASK的信息。事实上,描述是讨论“面具”的唯一地方
这里有一个类似的问题,但我不太明白发生了什么。我无法想象一个人需要创建源代码补丁,然后重新编译运行库和加载程序来创建硬件掩码。(但我可能遗漏了一些明显的东西)
如何为x86_64创建仅限SSE2的掩码
以下是调查结果的主要部分:
==4536== Conditional jump or move depends on uninitialised value(s)
==4536== at 0x4C34C26: __memcmp_sse4_1 (vg_replace_strmem.c:1099)
==4536== by 0x48B3B5: compare (char_traits.h:310)
==4536== by 0x48B3B5: __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type std::operator==<char>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:6006)
==4536== by 0x4F8E9C: operator!=<char, std::char_traits<char>, std::allocator<char> > (basic_string.h:6045)
...
这是Valgrind生成的唯一发现。这是酷刑测试的一部分,字符串长度为128KB
当我通过C7-D在2000年初的32位上仅使用SSE和SSE2执行相同的测试时,问题并没有出现<代码>\u memcmp\u sse4\u 1引起了很多怀疑
在Asan、Bsan、UBsan、Coverity和Microsoft的企业分析下,代码也很干净。Valgrind试验是唯一一个得出结论的试验
这是系统信息
- 操作系统:Fedora 26,x86_64,完全修补
- Valgrind:Valgrind-3.14.0.GIT(从源代码构建)
- Glibc:
ldd(GNU libc)2.25
- 编译器:GCC4.8-GCC7.2
- 编译器选项:
-DNDEBUG-g3-O1-DCRYPTOPP\u VALGRIND
-DCRYPTOPP_VALGRIND
没有发生任何特殊情况。在进行此类测试时,我们将启用更多测试。您使用的valgrind和glibc版本是什么?@EmployedRussian-Valgirnd是valgrind-3.14-Git,glibc是2.25。
==4536== Conditional jump or move depends on uninitialised value(s)
==4536== at 0x4C34C26: __memcmp_sse4_1 (vg_replace_strmem.c:1099)
==4536== by 0x48B3B5: compare (char_traits.h:310)
==4536== by 0x48B3B5: __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type std::operator==<char>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:6006)
==4536== by 0x4F8E9C: operator!=<char, std::char_traits<char>, std::allocator<char> > (basic_string.h:6045)
...
if (test == "EncryptXorDigest" && xorDigest != ciphertextXorDigest)
{
...
}