提问人:RL-S 提问时间:7/5/2022 最后编辑:RL-S 更新时间:7/5/2022 访问量:700
编译器、库或用户错误?Eigen::Array,GCC 12.1,“数组下标 [...]部分超出数组边界”
Compiler, library, or user error? Eigen::Array, GCC 12.1, "array subscript [...] is partly outside array bounds"
问:
更新到 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=native
note: 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,本征?还是用户错误?
告诉我错误注释()中的内容的奖励积分。是开始,是读取大小?24
offset [16, 24]
16
24
编辑:示例可以通过使用和进一步简化,请参阅此处。Array3d
Array2d
答: 暂无答案
评论
using scalar = double;
using scalar = double;