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

Compiler, library, or user error? Eigen::Array, GCC 12.1, "array subscript [...] is partly outside array bounds"

提问人:RL-S 提问时间:7/5/2022 最后编辑:RL-S 更新时间:7/5/2022 访问量:700

问:

更新到 GCC 12.1 后,我的项目中出现错误(或者更确切地说是警告),所以我尝试隔离问题。array subscript ‘__m256d_u[0]’ is partly outside array bounds-Werror

这是一个 MWE,我也把它放在 godbolt 上(vector type 是,但除此之外是相同的错误):__m512d_u

#include <Eigen/Dense>
#include <iostream>

using Eigen::Array;

Array<double, 3, 2> foo(){

    Array<double, 2, 2> a;
    a.setRandom();

    Array<double, 3, 2> b;
    b.col(0).tail(2) = a.col(1);
    // b.col(0).template tail<2>() = a.col(1);

    return b;
}

int main(){
    std::cout << foo() << '\n';
    return 0;
}

相关的编译选项是 ,错误消息注释 。-Wall -Wextra -Werror -O3 -march=nativenote: at offset [16, 24] into object ‘a’ of size 32

在以下情况下不会发生该错误:

  • 在 GCC 11.3 或更早版本上,
  • 删除时-march=native
  • 使用时或以下-O1
  • 将线路替换为b.col(0).tail(2) = a.col(1);b.col(0).template tail<2>() = a.col(1);

因此,看起来 GCC 看到了 3x2 数组和 2x2 数组,并且没有意识到每个数组只访问了两个条目。

我现在的问题是:这应该报告给谁?GCC,本征?还是用户错误?

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

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

C++ 数组 矢量化 特征 特征 3

评论

0赞 Ulrich Eckhardt 7/5/2022
什么线?它是否报告了其他任何内容?相关吗?using scalar = double;
0赞 RL-S 7/5/2022
查看 godbolt 链接了解所有详细信息。行是 #13,即最后一个项目符号中提到的那个。 无关紧要,从我的项目创建 MWE 时对我来说更容易。我在发帖时忘记了。现在我更新了它,现在相关行是#12using scalar = double;
1赞 Ulrich Eckhardt 7/5/2022
只有两个想法:查看 GCC 和 Eigen 的错误报告,也许你会在其中任何一个中找到一些东西。无论如何,您是否尝试过在其上使用内存调试器(我想到了 Valgrind)?这将是一个很大的指标,表明这实际上是一个错误或误报。
1赞 Fedor 7/14/2022
我向 GCC: gcc.gnu.org/bugzilla/show_bug.cgi?id=106247 和 Eigen: gitlab.com/libeigen/eigen/-/issues/2506 报告了这个问题
0赞 Marc Glisse 8/20/2022
这一系列的警告非常不可靠(首先,请参阅 gcc.gnu.org/bugzilla/show_bug.cgi?id=56456 中链接的错误数量...),只需忽略/禁用它们即可。

答: 暂无答案