为什么在使用Clang 3.9时,返回复制的Matrix3d的元素会导致不正确的输出?

为什么在使用Clang 3.9时,返回复制的Matrix3d的元素会导致不正确的输出?,clang,eigen,eigen3,Clang,Eigen,Eigen3,在Clang 3.9上使用-O2编译以下示例,在main中调用时,会导致重新编程返回垃圾(1.9038e+185): 代码 reproFunction,通过在中的R\u赋值来初始化R(这是常量)。它返回R(1,2)。在赋值和返回之间,reproFunction在多个操作中使用R,但它们都不能更改R。删除任何这些操作都会导致reproFunction返回正确的值 在以下任何情况下都不会出现此行为: 该程序是用clang3.5、clang4.0或g++-5.4编译的 优化级别为-O1或更低 使用特

在Clang 3.9上使用
-O2
编译以下示例,在
main
中调用时,会导致重新编程返回垃圾(
1.9038e+185
):

代码
reproFunction
,通过在中的
R\u赋值来初始化
R
(这是常量)。它返回
R(1,2)
。在赋值和返回之间,
reproFunction
在多个操作中使用
R
,但它们都不能更改
R
。删除任何这些操作都会导致
reproFunction
返回正确的值

在以下任何情况下都不会出现此行为:

  • 该程序是用clang3.5、clang4.0或g++-5.4编译的
  • 优化级别为
    -O1
    或更低
  • 使用特征值3.2.10代替特征值3.3.3
现在的问题是:这种行为是因为我在上面的代码中遗漏了一个bug,是因为Eigen 3.3.3中的bug,还是因为Clang 3.9中的bug


可以在中找到一个独立的复制示例。

我可以用Clang3.9复制,但不能用Clang3.8。我将伊根这边的问题一分为二:

错误256:启用未对齐加载/存储的矢量化。这涉及所有体系结构和所有大小。通过定义特征值未对齐向量化=0,可以禁用此新行为

该提交允许对未对齐的数据执行矢量化操作

我仍然认为,这是clang中的一个bug,但是您可以通过使用编译来解决它

-D EIGEN_UNALIGNED_VECTORIZE=0

此外,如果检测到clang 3.9作为编译器,可以通过自动禁用此功能来“修复”Eigen。

这听起来很像clang中的一个bug。只是出于好奇,R12的
?它离R(1,2)
(in)有多远?这并不能解决问题,我只是想知道…@AviGinsburg:我已经为上面的
R12
的值添加了一行输出。它似乎是一个垃圾值,而不是我最初记错的0。ulp距离为`-2.77422e+18`。示例的分支现在打印出由
float\u distance
返回的结果,该结果可能与该叮当声相关。
R12 == R(1,2): 0
R12: 1.9036e+185
R(1, 2): 0.7
-D EIGEN_UNALIGNED_VECTORIZE=0