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

  1. Compile with: g++ example_1.cpp -fsanitize=address -o example_1 -I/eigen/src -g

  2. 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.