gpt4 book ai didi

c++ - Clang 产生 GCC 不产生的非法指令

转载 作者:IT老高 更新时间:2023-10-28 22:34:47 26 4
gpt4 key购买 nike

我发现 Clang 产生非法指令的情况,而 gcc 没有,在尝试 this 时问题。

我的问题是:我做错了什么,还是 Clang 的实际问题?

我将其归结为重现问题所需的最小片段。

获取文件eigen.cpp :

#include <iostream>

#define EIGEN_MATRIXBASE_PLUGIN "eigen_matrix_addons.hpp"
#include <Eigen/Dense>

int main() {
Eigen::Matrix2d A;

A << 0, 1, 2, 3;

std::cout << A << "\n";
}

还有文件 eigen_matrix_addons.hpp :

friend std::ostream &operator<<(std::ostream &o, const Derived &m) {
o << static_cast<const MatrixBase<Derived> &>(m);
}

(参见 here 了解该文件的详细说明。简而言之,它的内容直接放在 template<class Derived> class MatrixBase; 的类定义中。因此,这在 Derived 上引入了另一个调用 Eigen 的 ostream 运算符在 MatrixBase<Derived> 上实现 ostream 运算符。如果您阅读 this question,这样做的动机就会很明显。)

使用 GCC 编译并运行:

$ g++ -std=c++11 -Wall -Wextra -pedantic -isystem/usr/include/eigen3 -I. -o eigen_gcc eigen.cpp
$ ./eigen_gcc
0 1
2 3
$ g++ --version
g++ (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

然后用Clang编译并运行:

$ clang++ -std=c++11 -Wall -Wextra -pedantic -isystem/usr/include/eigen3 -I. -o eigen_clang eigen.cpp
$ ./eigen_clang
0 1
Illegal instruction
$ clang++ --version
clang version 3.4 (branches/release_34 198681)
Target: x86_64-suse-linux
Thread model: posix

如您所见,程序在执行非法指令后被中断。 gdb 中的回溯显示问题发生在 eigen_matrix_addons.hpp 的第二行。 :

(gdb) bt
#0 0x00000000004013e1 in Eigen::operator<< (o=..., m=...)
at ./eigen_matrix_addons.hpp:2
#1 0x00000000004010f0 in main () at eigen.cpp:15

即可能是 static_cast ?

根据 zypper,我的 Eigen 版本是 3.2.0-2.1.4 .

编辑

@Mysticial 要求的反汇编:

(gdb) disass
Dump of assembler code for function Eigen::operator<<(std::ostream&, Eigen::Matrix<double, 2, 2, 0, 2, 2> const&):
0x00000000004013c0 <+0>: push %rbp
0x00000000004013c1 <+1>: mov %rsp,%rbp
0x00000000004013c4 <+4>: sub $0x20,%rsp
0x00000000004013c8 <+8>: mov %rdi,-0x10(%rbp)
0x00000000004013cc <+12>: mov %rsi,-0x18(%rbp)
0x00000000004013d0 <+16>: mov -0x10(%rbp),%rdi
0x00000000004013d4 <+20>: mov -0x18(%rbp),%rsi
0x00000000004013d8 <+24>: callq 0x4013f0 <Eigen::operator<< <Eigen::Matrix<double, 2, 2, 0, 2, 2> >(std::ostream&, Eigen::DenseBase<Eigen::Matrix<double, 2, 2, 0, 2, 2> > const&)>
0x00000000004013dd <+29>: mov %rax,-0x20(%rbp)
=> 0x00000000004013e1 <+33>: ud2
End of assembler dump.

最佳答案

“非法指令”错误很可能是因为您的“运算符 <<”缺少返回语句。这会导致未定义的行为。

标准第 6.6.3 节说:

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

你应该添加:

return o;

在函数的末尾。

关于c++ - Clang 产生 GCC 不产生的非法指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25147667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com