编译器、库或用户错误?Eigen::Array,GCC 12.1,“数组下标 [...] 部分超出数组边界”

RL-*_*L-S 8 c++ arrays vectorization eigen eigen3

更新到 GCC 12.1 后,我的项目中出现array subscript \xe2\x80\x98__m256d_u[0]\xe2\x80\x99 is partly outside array bounds错误(或者更确切地说带有 的警告-Werror),因此我尝试隔离问题。

\n

这是一个 MWE,我也将其放在godbolt上(改为矢量类型__m512d_u,但否则是相同的错误):

\n
#include <Eigen/Dense>\n#include <iostream>\n\nusing Eigen::Array;\n\nArray<double, 3, 2> foo(){\n\n    Array<double, 2, 2> a;\n    a.setRandom();\n\n    Array<double, 3, 2> b;\n    b.col(0).tail(2) = a.col(1);\n    // b.col(0).template tail<2>() = a.col(1);\n\n    return b;\n}\n\nint main(){\n    std::cout << foo() << \'\\n\';\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

相关的编译选项有-Wall -Wextra -Werror -O3 -march=native,以及错误信息注释note: at offset [16, 24] into object \xe2\x80\x98a\xe2\x80\x99 of size 32

\n

在以下情况下不会出现该错误:

\n
    \n
  • 在 GCC 11.3 或更早版本上,
  • \n
  • 当移除时-march=native
  • \n
  • 使用-O1或低于时
  • \n
  • 当替换该b.col(0).tail(2) = a.col(1);行时b.col(0).template tail<2>() = a.col(1);
  • \n
\n

所以看起来 GCC 看到了 3x2 数组和 2x2 数组,但没有意识到每个数组只访问了两个条目。

\n

我现在的问题是:这件事应该向谁报告?海湾合作委员会,艾根?还是用户的bug?

\n

告诉我24错误注释 ( offset [16, 24]) 中的内容即可获得奖励积分。是16开始,是24读取大小?

\n

编辑:示例可以通过使用Array3d和进一步简化Array2d,请参阅此处

\n