Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compilation error on gcc 12: pointer used after ‘void operator delete(void*, std::size_t)’ #1005

Open
kpu opened this issue Aug 30, 2023 · 0 comments
Labels

Comments

@kpu
Copy link
Member

kpu commented Aug 30, 2023

Marian doesn't compile with gcc 12.3.1 due to issues with intrusive pointer. Note that there are two kinds of error: pointer used after and pointer may be used. It would seem in the first error that the compiler is definitely finding an issue.

gcc --version
gcc (Gentoo 12.3.1_p20230526 p2) 12.3.1 20230526
Copyright (C) 2022 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.
In file included from /home/kpu/marian-dev/src/common/definitions.h:5,
                 from /home/kpu/marian-dev/src/tensors/tensor.h:3,
                 from /home/kpu/marian-dev/src/optimizers/clippers.h:6,
                 from /home/kpu/marian-dev/src/optimizers/clippers.cpp:1:
In function ‘void marian::intrusivePtrRelease(TensorBase*)’,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘virtual float marian::ElementwiseClipper::clip(marian::Tensor, float)’ at /home/kpu/marian-dev/src/optimizers/clippers.cpp:9:10:
/home/kpu/marian-dev/src/common/intrusive_ptr.h:24:23: error: pointer used after ‘void operator delete(void*, std::size_t)’ [-Werror=use-after-free]
   24 |     if(x != 0 && --x->references_ == 0) {    \
      |                    ~~~^~~~~~~~~~~
/home/kpu/marian-dev/src/tensors/tensor.h:38:3: note: in expansion of macro ‘ENABLE_INTRUSIVE_PTR’
   38 |   ENABLE_INTRUSIVE_PTR(TensorBase)
      |   ^~~~~~~~~~~~~~~~~~~~
In destructor ‘virtual marian::TensorBase::~TensorBase()’,
    inlined from ‘void marian::intrusivePtrRelease(TensorBase*)’ at /home/kpu/marian-dev/src/tensors/tensor.h:38:3,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘void marian::Element(Functor, Tensor, Tensors ...) [with Functor = functional::Assign<functional::Var<1>, functional::BinaryFunctor<functional::elem::Clip, functional::Assignee<1>, functional::Capture> >; Tensors = {}]’ at /home/kpu/marian-dev/src/tensors/tensor_operators.h:75:17,
    inlined from ‘virtual float marian::ElementwiseClipper::clip(marian::Tensor, float)’ at /home/kpu/marian-dev/src/optimizers/clippers.cpp:9:10:
/home/kpu/marian-dev/src/tensors/tensor.h:76:26: note: call to ‘void operator delete(void*, std::size_t)’ here
   76 |   virtual ~TensorBase() {}
      |                          ^
cc1plus: all warnings being treated as errors
make[2]: *** [src/CMakeFiles/marian.dir/build.make:958: src/CMakeFiles/marian.dir/optimizers/clippers.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
In file included from /home/kpu/marian-dev/src/common/definitions.h:5,
                 from /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:1:
In function ‘void marian::intrusivePtrRelease(TensorBase*)’,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘void marian::ExponentialSmoothing::updateAvgParams(marian::Tensor, marian::Tensor, size_t, size_t)’ at /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:24:10:
/home/kpu/marian-dev/src/common/intrusive_ptr.h:24:23: error: pointer may be used after ‘void operator delete(void*, std::size_t)’ [-Werror=use-after-free]
   24 |     if(x != 0 && --x->references_ == 0) {    \
      |                    ~~~^~~~~~~~~~~
/home/kpu/marian-dev/src/tensors/tensor.h:38:3: note: in expansion of macro ‘ENABLE_INTRUSIVE_PTR’
   38 |   ENABLE_INTRUSIVE_PTR(TensorBase)
      |   ^~~~~~~~~~~~~~~~~~~~
In file included from /home/kpu/marian-dev/src/tensors/tensor_operators.h:5,
                 from /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:3:
In destructor ‘virtual marian::TensorBase::~TensorBase()’,
    inlined from ‘void marian::intrusivePtrRelease(TensorBase*)’ at /home/kpu/marian-dev/src/tensors/tensor.h:38:3,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘void marian::Element(Functor, Tensor, Tensors ...) [with Functor = functional::Assign<functional::Var<1>, functional::BinaryFunctor<functional::elem::Plus, functional::BinaryFunctor<functional::elem::Mult, functional::Capture, functional::Assignee<1> >, functional::BinaryFunctor<functional::elem::Mult, functional::Capture, functional::Assignee<2> > > >; Tensors = {IntrusivePtr<TensorBase>}]’ at /home/kpu/marian-dev/src/tensors/tensor_operators.h:75:17,
    inlined from ‘void marian::ExponentialSmoothing::updateAvgParams(marian::Tensor, marian::Tensor, size_t, size_t)’ at /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:24:10:
/home/kpu/marian-dev/src/tensors/tensor.h:76:26: note: call to ‘void operator delete(void*, std::size_t)’ here
   76 |   virtual ~TensorBase() {}
      |                          ^
In function ‘void marian::intrusivePtrRelease(TensorBase*)’,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘void marian::ExponentialSmoothing::updateAvgParams(marian::Tensor, marian::Tensor, size_t, size_t)’ at /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:24:10:
/home/kpu/marian-dev/src/common/intrusive_ptr.h:24:23: error: pointer may be used after ‘void operator delete(void*, std::size_t)’ [-Werror=use-after-free]
   24 |     if(x != 0 && --x->references_ == 0) {    \
      |                    ~~~^~~~~~~~~~~
/home/kpu/marian-dev/src/tensors/tensor.h:38:3: note: in expansion of macro ‘ENABLE_INTRUSIVE_PTR’
   38 |   ENABLE_INTRUSIVE_PTR(TensorBase)
      |   ^~~~~~~~~~~~~~~~~~~~
In destructor ‘virtual marian::TensorBase::~TensorBase()’,
    inlined from ‘void marian::intrusivePtrRelease(TensorBase*)’ at /home/kpu/marian-dev/src/tensors/tensor.h:38:3,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘void marian::Element(Functor, Tensor, Tensors ...) [with Functor = functional::Assign<functional::Var<1>, functional::BinaryFunctor<functional::elem::Plus, functional::BinaryFunctor<functional::elem::Mult, functional::Capture, functional::Assignee<1> >, functional::BinaryFunctor<functional::elem::Mult, functional::Capture, functional::Assignee<2> > > >; Tensors = {IntrusivePtr<TensorBase>}]’ at /home/kpu/marian-dev/src/tensors/tensor_operators.h:75:17,
    inlined from ‘void marian::ExponentialSmoothing::updateAvgParams(marian::Tensor, marian::Tensor, size_t, size_t)’ at /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:24:10:
/home/kpu/marian-dev/src/tensors/tensor.h:76:26: note: call to ‘void operator delete(void*, std::size_t)’ here
   76 |   virtual ~TensorBase() {}
      |                          ^
In function ‘void marian::intrusivePtrRelease(TensorBase*)’,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘void marian::ExponentialSmoothing::updateAvgParams(marian::Tensor, marian::Tensor, size_t, size_t)’ at /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:24:10:
/home/kpu/marian-dev/src/common/intrusive_ptr.h:24:23: error: pointer may be used after ‘void operator delete(void*, std::size_t)’ [-Werror=use-after-free]
   24 |     if(x != 0 && --x->references_ == 0) {    \
      |                    ~~~^~~~~~~~~~~
/home/kpu/marian-dev/src/tensors/tensor.h:38:3: note: in expansion of macro ‘ENABLE_INTRUSIVE_PTR’
   38 |   ENABLE_INTRUSIVE_PTR(TensorBase)
      |   ^~~~~~~~~~~~~~~~~~~~
In destructor ‘virtual marian::TensorBase::~TensorBase()’,
    inlined from ‘void marian::intrusivePtrRelease(TensorBase*)’ at /home/kpu/marian-dev/src/tensors/tensor.h:38:3,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘void marian::Element(Functor, Tensor, Tensors ...) [with Functor = functional::Assign<functional::Var<1>, functional::BinaryFunctor<functional::elem::Plus, functional::BinaryFunctor<functional::elem::Mult, functional::Capture, functional::Assignee<1> >, functional::BinaryFunctor<functional::elem::Mult, functional::Capture, functional::Assignee<2> > > >; Tensors = {IntrusivePtr<TensorBase>}]’ at /home/kpu/marian-dev/src/tensors/tensor_operators.h:75:17,
    inlined from ‘void marian::ExponentialSmoothing::updateAvgParams(marian::Tensor, marian::Tensor, size_t, size_t)’ at /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:24:10:
/home/kpu/marian-dev/src/tensors/tensor.h:76:26: note: call to ‘void operator delete(void*, std::size_t)’ here
   76 |   virtual ~TensorBase() {}
      |                          ^
In function ‘void marian::intrusivePtrRelease(TensorBase*)’,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘void marian::ExponentialSmoothing::updateAvgParams(marian::Tensor, marian::Tensor, size_t, size_t)’ at /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:24:10:
/home/kpu/marian-dev/src/common/intrusive_ptr.h:24:23: error: pointer may be used after ‘void operator delete(void*, std::size_t)’ [-Werror=use-after-free]
   24 |     if(x != 0 && --x->references_ == 0) {    \
      |                    ~~~^~~~~~~~~~~
/home/kpu/marian-dev/src/tensors/tensor.h:38:3: note: in expansion of macro ‘ENABLE_INTRUSIVE_PTR’
   38 |   ENABLE_INTRUSIVE_PTR(TensorBase)
      |   ^~~~~~~~~~~~~~~~~~~~
In destructor ‘virtual marian::TensorBase::~TensorBase()’,
    inlined from ‘void marian::intrusivePtrRelease(TensorBase*)’ at /home/kpu/marian-dev/src/tensors/tensor.h:38:3,
    inlined from ‘IntrusivePtr<T>::~IntrusivePtr() [with T = marian::TensorBase]’ at /home/kpu/marian-dev/src/common/intrusive_ptr.h:66:26,
    inlined from ‘void marian::Element(Functor, Tensor, Tensors ...) [with Functor = functional::Assign<functional::Var<1>, functional::BinaryFunctor<functional::elem::Plus, functional::BinaryFunctor<functional::elem::Mult, functional::Capture, functional::Assignee<1> >, functional::BinaryFunctor<functional::elem::Mult, functional::Capture, functional::Assignee<2> > > >; Tensors = {IntrusivePtr<TensorBase>}]’ at /home/kpu/marian-dev/src/tensors/tensor_operators.h:75:17,
    inlined from ‘void marian::ExponentialSmoothing::updateAvgParams(marian::Tensor, marian::Tensor, size_t, size_t)’ at /home/kpu/marian-dev/src/optimizers/exponential_smoothing.cpp:24:10:
/home/kpu/marian-dev/src/tensors/tensor.h:76:26: note: call to ‘void operator delete(void*, std::size_t)’ here
   76 |   virtual ~TensorBase() {}
      |                          ^
cc1plus: all warnings being treated as errors
make[2]: *** [src/CMakeFiles/marian.dir/build.make:986: src/CMakeFiles/marian.dir/optimizers/exponential_smoothing.cpp.o] Error 1

I've been trying to suss this out. It seems to be the temporary Tensor (i.e. an intrusive_ptr) is having the issue.

@kpu kpu added the bug label Aug 30, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant