Skip to content

Conversation

@dirk-zimoch
Copy link
Contributor

Fix false (?) warning in

void refsave()
{
try {
epics::RefSnapshot snap;
snap.update();
savedSnap.swap(snap);
}CATCH()
}

In file included from /usr/include/c++/12/map:60,
                 from epics-base-7.0/include/pv/reftrack.h:42,
                 from ../reftrackioc.cpp:11:
In member function ‘void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::swap(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&) [with _Key = std::__cxx11::basic_string<char>; _Val = std::pair<const std::__cxx11::basic_string<char>, epics::RefSnapshot::Count>; _KeyOfValue = std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, epics::RefSnapshot::Count> >; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, epics::RefSnapshot::Count> >]’,
    inlined from ‘void std::map<_Key, _Tp, _Compare, _Alloc>::swap(std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::__cxx11::basic_string<char>; _Tp = epics::RefSnapshot::Count; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, epics::RefSnapshot::Count> >]’ at /usr/include/c++/12/bits/stl_map.h:1172:18,
    inlined from ‘void epics::RefSnapshot::swap(epics::RefSnapshot&)’ at epics-base-7.0/include/pv/reftrack.h:105:20,
    inlined from ‘void {anonymous}::refsave()’ at ../reftrackioc.cpp:57:23,
    inlined from ‘void epics::detail::call0(const iocshArgBuf*) [with void (* fn)() = {anonymous}::refsave]’ at ../reftrackioc.cpp:87:26:
/usr/include/c++/12/bits/stl_tree.h:2091:36: warning: storing the address of local variable ‘snap’ in ‘*MEM[(struct _Rb_tree_node_base * &)&snap + 16].std::_Rb_tree_node_base::_M_parent’ [-Wdangling-pointer=]
 2091 |           __t._M_root()->_M_parent = __t._M_end();
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
../reftrackioc.cpp: In function ‘void epics::detail::call0(const iocshArgBuf*) [with void (* fn)() = {anonymous}::refsave]’:
../reftrackioc.cpp:54:28: note: ‘snap’ declared here
   54 |         epics::RefSnapshot snap;
      |                            ^~~~
../reftrackioc.cpp:54:28: note: ‘snap.epics::RefSnapshot::counts.std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, epics::RefSnapshot::Count, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, epics::RefSnapshot::Count> > >::_M_t.std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, epics::RefSnapshot::Count>, std::_Select1st<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, epics::RefSnapshot::Count> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, epics::RefSnapshot::Count> > >::_M_impl.std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, epics::RefSnapshot::Count>, std::_Select1st<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, epics::RefSnapshot::Count> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, epics::RefSnapshot::Count> > >::_Rb_tree_impl<std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, true>::<unnamed>.std::_Rb_tree_header::_M_header.std::_Rb_tree_node_base::_M_parent’ declared here

It seems gcc 12 does not like the fact that savedSnap.swap(snap) references a local variable (snap).
Other c++11 capable gcc versions (tested 8 ... 14) do not show a warning here. Neither does clang or MSVC.

// No locking. assume only interactive iocsh use
static epics::RefSnapshot savedSnap;

#if __GNUC__ == 12
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not enthusiastic about filling up source files with blocks like this to silence specific false positive warnings, especially those occurring with only a single compiler series.

Copy link
Contributor Author

@dirk-zimoch dirk-zimoch Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My preferred way would have been to put -Wno-dangling-pointer into the Makefile, but I don't know how to do this for gcc 12 only (much older gcc versions as used by VxWorks would not understand that option).
So I see 4 other options:

  • We declare gcc 12 unsuitable for EPICS.
  • We never check for dangling pointers.
  • We give up on having a warning-free code base.
  • You modify refsave() so that it does not use a local variable. Maybe a global one?

Copy link
Contributor Author

@dirk-zimoch dirk-zimoch Nov 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found a way to do it in the Makefile instead of the code. New approach pushed.
That one disables the warning for the whole file, not only for the one function.

@AppVeyorBot
Copy link

@AppVeyorBot
Copy link

@AppVeyorBot
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants