SEGV on unknown address: AutoDiff + Tensor contraction
Summary
Using Eigen/AutoDiff with Eigen::Tensor contractions results in SEGV
Environment
- Operating System : Ubuntu Linux 22.04
- Architecture : x64
- Eigen Version : 3.4.90
- Compiler Version : g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
- Compile Flags : -fsanitize=address -o -g
- Vector Extension : none
Minimal Example
#include <unsupported/Eigen/CXX11/Tensor>
#include <unsupported/Eigen/AutoDiff>
typedef typename Eigen::AutoDiffScalar<Eigen::VectorXf> AutoDiff_T;
typedef typename Eigen::Tensor<AutoDiff_T, 2>::DimensionPair DimPair;
int main(int, char **)
{
Eigen::Tensor<AutoDiff_T, 2> X(2, 2);
Eigen::Tensor<AutoDiff_T, 2> W(2, 2);
const int size = X.size() + W.size();
X(0, 0).value() = 1.f;
X(0, 0).derivatives() = Eigen::VectorXf::Unit(size, 0);
X(1, 0).value() = 1.f;
X(1, 0).derivatives() = Eigen::VectorXf::Unit(size, 1);
X(0, 1).value() = 1.f;
X(0, 1).derivatives() = Eigen::VectorXf::Unit(size, 2);
X(1, 1).value() = 1.f;
X(1, 1).derivatives() = Eigen::VectorXf::Unit(size, 3);
W(0, 0).value() = 1.f;
W(0, 0).derivatives() = Eigen::VectorXf::Unit(size, 4);
W(1, 0).value() = 1.f;
W(1, 0).derivatives() = Eigen::VectorXf::Unit(size, 5);
W(0, 1).value() = 1.f;
W(0, 1).derivatives() = Eigen::VectorXf::Unit(size, 6);
W(1, 1).value() = 1.f;
W(1, 1).derivatives() = Eigen::VectorXf::Unit(size, 7);
Eigen::array<DimPair, 1> dims;
dims[0] = DimPair(1, 0);
Eigen::Tensor<AutoDiff_T, 2> Z = X.contract(W, dims);
return 0;
}
Steps to reproduce
-
Compile with: g++ example_1.cpp -fsanitize=address -o example_1 -I/eigen/src -g
-
Execute with: ./example_1
What is the current bug behavior?
The program results in a segmentation fault. Please check the log below.
What is the expected correct behavior?
The program should calculate the contraction and derivatives without any segmentation fault.
I proceeded with two more checks:
1 - Contraction without autodiff
2 - Convolution with autodiff
In these last cases, the program no longer causes SEGV:
contraction without autodiff:
#include <unsupported/Eigen/CXX11/Tensor>
typedef typename Eigen::Tensor<float, 2>::DimensionPair DimPair;
int main(int, char **)
{
Eigen::Tensor<float, 2> X(2, 2);
Eigen::Tensor<float, 2> W(2, 2);
const int size = X.size() + W.size();
X(0, 0) = 1.f;
X(1, 0) = 1.f;
X(0, 1) = 1.f;
X(1, 1) = 1.f;
W(0, 0) = 1.f;
W(1, 0) = 1.f;
W(0, 1) = 1.f;
W(1, 1) = 1.f;
Eigen::array<DimPair, 1> dims;
dims[0] = DimPair(1, 0);
Eigen::Tensor<float, 2> Z = X.contract(W, dims);
return 0;
}
Convolution with autodiff:
#include <unsupported/Eigen/CXX11/Tensor>
#include <unsupported/Eigen/AutoDiff>
typedef typename Eigen::AutoDiffScalar<Eigen::VectorXf> AutoDiff_T;
typedef typename Eigen::Tensor<AutoDiff_T, 2>::DimensionPair DimPair;
int main(int, char **)
{
Eigen::Tensor<AutoDiff_T, 2> X(2, 2);
Eigen::Tensor<AutoDiff_T, 2> W(2, 2);
const int size = X.size() + W.size();
X(0, 0).value() = 1.f;
X(0, 0).derivatives() = Eigen::VectorXf::Unit(size, 0);
X(1, 0).value() = 1.f;
X(1, 0).derivatives() = Eigen::VectorXf::Unit(size, 1);
X(0, 1).value() = 1.f;
X(0, 1).derivatives() = Eigen::VectorXf::Unit(size, 2);
X(1, 1).value() = 1.f;
X(1, 1).derivatives() = Eigen::VectorXf::Unit(size, 3);
W(0, 0).value() = 1.f;
W(0, 0).derivatives() = Eigen::VectorXf::Unit(size, 4);
W(1, 0).value() = 1.f;
W(1, 0).derivatives() = Eigen::VectorXf::Unit(size, 5);
W(0, 1).value() = 1.f;
W(0, 1).derivatives() = Eigen::VectorXf::Unit(size, 6);
W(1, 1).value() = 1.f;
W(1, 1).derivatives() = Eigen::VectorXf::Unit(size, 7);
Eigen::array<ptrdiff_t, 2> dims({0, 1});
Eigen::Tensor<AutoDiff_T, 2> Z = X.convolve(W, dims);
return 0;
}
Relevant logs
This is the sanitizer output for the case of contraction with autodiff:
AddressSanitizer:DEADLYSIGNAL
=================================================================
==50065==ERROR: AddressSanitizer: SEGV on unknown address (pc 0x55ecbfc67c23 bp 0x7ffc5b568460 sp 0x7ffc5b568440 T0)
==50065==The signal is caused by a READ memory access.
==50065==Hint: this fault was caused by a dereference of a high value address (see register values below). Dissassemble the provided pc to learn which register was used.
#0 0x55ecbfc67c23 in Eigen::internal::handmade_aligned_free(void*) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/util/Memory.h:169
#1 0x55ecbfc67ce0 in Eigen::internal::aligned_free(void*) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/util/Memory.h:243
#2 0x55ecbfc6c0ee in void Eigen::internal::conditional_aligned_free<true>(void*) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/util/Memory.h:303
#3 0x55ecbfc6f0a2 in void Eigen::internal::conditional_aligned_delete_auto<float, true>(float*, unsigned long) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/util/Memory.h:533
#4 0x55ecbfccf886 in Eigen::DenseStorage<float, -1, -1, 1, 0>::resize(long, long, long) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/DenseStorage.h:674
#5 0x55ecbfc75a80 in Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >::resize(long, long) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/PlainObjectBase.h:298
#6 0x55ecbfcef3a2 in void Eigen::internal::resize_if_allowed<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, float, float>(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:790
#7 0x55ecbfce70b9 in void Eigen::internal::call_dense_assignment_loop<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::assign_op<float, float> >(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:804
#8 0x55ecbfcd6179 in Eigen::internal::Assignment<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::assign_op<float, float>, Eigen::internal::Dense2Dense, void>::run(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:980
#9 0x55ecbfccf6e8 in void Eigen::internal::call_assignment_no_alias<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::assign_op<float, float> >(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:916
#10 0x55ecbfc7590c in void Eigen::internal::call_assignment<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::assign_op<float, float> >(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, Eigen::internal::assign_op<float, float> const&, std::enable_if<!Eigen::internal::evaluator_assume_aliasing<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::internal::evaluator_traits<Eigen::Matrix<float, -1, 1, 0, -1, 1> >::Shape>::value, void*>::type) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:884
#11 0x55ecbfc70901 in void Eigen::internal::call_assignment<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::Matrix<float, -1, 1, 0, -1, 1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/AssignEvaluator.h:862
#12 0x55ecbfc6ff74 in Eigen::Matrix<float, -1, 1, 0, -1, 1>& Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> >::_set<Eigen::Matrix<float, -1, 1, 0, -1, 1> >(Eigen::DenseBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/PlainObjectBase.h:772
#13 0x55ecbfc6f78a in Eigen::Matrix<float, -1, 1, 0, -1, 1>::operator=(Eigen::Matrix<float, -1, 1, 0, -1, 1> const&) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/Matrix.h:211
#14 0x55ecbfc6eee0 in Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >::operator=(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&) /eigen/src/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h:142
#15 0x55ecbfce9eb4 in void Eigen::internal::pstore<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> > >(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/GenericPacketMath.h:849
#16 0x55ecbfcd8a2e in Eigen::internal::gemm_pack_lhs<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, Eigen::internal::TensorContractionSubMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 1, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer>, 2, 1, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 0, false, false>::operator()(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*, Eigen::internal::TensorContractionSubMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 1, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer> const&, long, long, long, long) /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/products/GeneralBlockPanelKernel.h:2739
#17 0x55ecbfcd211e in Eigen::internal::TensorContractionKernel<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, Eigen::internal::blas_data_mapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 0, 0, 1>, Eigen::internal::TensorContractionInputMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 1, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer>, Eigen::internal::TensorContractionInputMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 0, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer> >::packLhs(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >**, Eigen::internal::TensorContractionSubMapper<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, long, 1, Eigen::TensorEvaluator<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::DefaultDevice>, std::array<long, 1ul>, std::array<long, 1ul>, 1, true, false, 0, Eigen::MakePointer> const&, long, long) /eigen/src/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h:243
#18 0x55ecbfc8b9c3 in void Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalGemmPartial<true, true, false, 0, true>(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*, long, long, int) const /eigen/src/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h:881
#19 0x55ecbfc71fcc in void Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalGemm<true, true, false, 0>(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) const /eigen/src/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h:787
#20 0x55ecbfc70558 in void Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalProductSequential<true, true, false, 0>(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) const /eigen/src/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h:724
#21 0x55ecbfc6fd71 in void Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice>::evalProduct<0>(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) const /eigen/src/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h:1013
#22 0x55ecbfc6f67c in Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalTo(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) const /eigen/src/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h:703
#23 0x55ecbfc6ec46 in Eigen::TensorContractionEvaluatorBase<Eigen::TensorEvaluator<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const, Eigen::DefaultDevice> >::evalSubExprsIfNeeded(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) /eigen/src/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h:609
#24 0x55ecbfc6c8e8 in Eigen::TensorEvaluator<Eigen::TensorAssignOp<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long>, Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const> const, Eigen::DefaultDevice>::evalSubExprsIfNeeded(Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >*) /eigen/src/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h:155
#25 0x55ecbfc6bd7c in Eigen::internal::TensorExecutor<Eigen::TensorAssignOp<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long>, Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const> const, Eigen::DefaultDevice, false, (Eigen::internal::TiledEvaluation)0>::run(Eigen::TensorAssignOp<Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long>, Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> const> const&, Eigen::DefaultDevice const&) /eigen/src/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h:101
#26 0x55ecbfc6b362 in Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long>::Tensor<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const> >(Eigen::TensorBase<Eigen::TensorContractionOp<std::array<Eigen::IndexPair<long>, 1ul> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::Tensor<Eigen::AutoDiffScalar<Eigen::Matrix<float, -1, 1, 0, -1, 1> >, 2, 0, long> const, Eigen::NoOpOutputKernel const>, 0> const&) /eigen/src/unsupported/Eigen/CXX11/src/Tensor/Tensor.h:305
#27 0x55ecbfc6761d in main /eigen_autodiff_SEGV/example_1.cpp:35
#28 0x7fd5ac629d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#29 0x7fd5ac629e3f in __libc_start_main_impl ../csu/libc-start.c:392
#30 0x55ecbfc665c4 in _start (/eigen_autodiff_SEGV/example_1+0x55c4)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV /eigen/src/unsupported/Eigen/CXX11/../../../Eigen/src/Core/util/Memory.h:169 in Eigen::internal::handmade_aligned_free(void*)
==50065==ABORTING
Anything else that might help
The sanitizer pointed to the following offender function:
/** \internal Frees memory allocated with handmade_aligned_malloc */
EIGEN_DEVICE_FUNC inline void handmade_aligned_free(void *ptr)
{
if (ptr) {
uint8_t offset = static_cast<uint8_t>(*(static_cast<uint8_t*>(ptr) - 1));
void* original = static_cast<void*>(static_cast<uint8_t*>(ptr) - offset);
check_that_malloc_is_allowed();
EIGEN_USING_STD(free)
free(original);
}
}
However, I am unsure if the problem is in this function, in another part of Eigen, or in my test case.