首页 > 解决方案 > Linux 重定向消息:__strlen_avx2、__mempcpy_avx_unaligned_erms、__strchrnul_avx2

问题描述

在此处输入图像描述

我对收到的三个重定向消息有疑问。只是为了给我的程序一些上下文......

我正在使用 C 编程和 Linux。我从包含字典中所有单词的文件中读取数字。我从文件中提取单词并将它们保存在一个字符串对象中,该对象由三件事组成:为单词动态分配的字符数组(字符串对象的设计是为了在数组末尾不需要空终止符) ,一个整数,表示当前存储的单词的大小,一个整数,表示当前动态分配的字符数组的容量。每个字符串对象本身都存储在一个向量中,我有一个由 30 个向量组成的数组,每个向量的索引对应于单词的大小。例如,我的向量数组中的索引 2 有 94 个单词,这意味着索引 2 处的向量包含 94 个字符串对象,每个对象包含一个大小为 2 的单词。将它们存储在向量中后,

到目前为止(我是一个相当新的 CS 学生,所以请耐心等待),我总是使用 valgrind 和 --leak-check=full 运行我的代码。如您所见,我没有内存泄漏或错误。但是,我意识到我也可以使用“-v”来运行我的程序,当我这样做时,我会收到三个重定向消息:

libc.so.6:__strlen_avx2
libc.so.6:__mempcpy_avx_unaligned_erms
libc.so.6:__strchrnul_avx2

我不知道这些是什么意思。我试图通过在线查找来为自己弄清楚,但我无法弄清楚,所以我想知道这些错误是什么意思。我要说的最后一件事是,第一个重定向消息涉及“strlen”,它是 C 的 string.h 库中的字符串库函数。但是,我从不使用 string.h。这个项目的重点是让我创建自己的自定义字符串对象和我自己的字符串函数库来处理这些字符串对象。所以,假设重定向消息是指 string.h 库函数,我不知道它为什么这样做。

我没有发布任何代码,因为这是一个漫长的项目。我只是在寻找关于这些消息可能指代的一般答案。

标签: clinuxredirect

解决方案


Valgrind 也会检查库函数的使用——例如strlen, memcpy, strchrnul.

当您在启用某些优化的情况下进行编译时,这些函数调用可能会替换为优化版本,即此处为 AVX 和 AVX2 优化的函数调用。但是这些函数正在做一些肮脏的把戏,否则这些在 C 语言中是非法的,而且也很难valgrind检查。因此 valgrind 将调用重定向到__strlen_avx2back strlen,以便 valgrind 可以更轻松地跟踪细节。现在,-v--verbose表示,它显示了更多信息......对于某些人来说,知道实际函数__strlen_avx2根本没有被调用可能很重要,这与不运行时不同valgrind,但是任何对它的调用都会跳转到strlen受控者valgrind


推荐阅读