array-bounds warnings in ubuntu build
Hello, I'm reviewing KEA as part of the Ubuntu Main Inclusion request. Part of this is taking a look through the build logs, and there's a few instances of -Warray-bounds
warnings that concern me:
- MIR process bug: https://bugs.launchpad.net/ubuntu/+source/isc-kea/+bug/2002861
- Ubuntu Lunar Build: https://launchpad.net/ubuntu/+source/isc-kea/2.2.0-5ubuntu1/+build/25670367
- Ubuntu Lunar direct build logs: https://launchpadlibrarian.net/655959506/buildlog_ubuntu-lunar-amd64.isc-kea_2.2.0-5ubuntu1_BUILDING.txt.gz
...
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I../../.. -I../../../src/lib -I../../../src/lib -Wdate-time -D_FORTIFY_SOURCE=2 -DOS_LINUX -I../../.. -I../../.. -Wall -Wextra -Wnon-virtual-dtor -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -pthread -Wno-missing-field-initializers -fPIC -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fdebug-prefix-map=/<<PKGBUILDDIR>>=/usr/src/isc-kea-2.2.0-5ubuntu1 -c libdhcp++.cc -fPIC -DPIC -o .libs/libkea_dhcp___la-libdhcp++.o
In file included from /usr/include/c++/12/string:50,
from /usr/include/boost/asio/ip/address.hpp:19,
from ../../../src/lib/asiolink/io_address.h:15,
from ../../../src/lib/dhcp/duid.h:10,
from ../../../src/lib/dhcp/duid_factory.h:10,
from duid_factory.cc:9:
In function ‘std::__copy_move<true, true, std::random_access_iterator_tag>::__copy_m<unsigned char>(unsigned char const*, unsigned char const*, unsigned char*)unsigned char*’,
inlined from ‘std::__copy_move_a2<true, unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:495:30,
inlined from ‘std::__copy_move_a1<true, unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:522:42,
inlined from ‘std::__copy_move_a<true, unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:529:31,
inlined from ‘std::copy<std::move_iterator<unsigned char*>, unsigned char*>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:620:7,
inlined from ‘std::__uninitialized_copy<true>::__uninit_copy<std::move_iterator<unsigned char*>, unsigned char*>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:147:27,
inlined from ‘std::uninitialized_copy<std::move_iterator<unsigned char*>, unsigned char*>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:185:15,
inlined from ‘std::__uninitialized_copy_a<std::move_iterator<unsigned char*>, unsigned char*, unsigned char>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*, std::allocator<unsigned char>&)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:372:37,
inlined from ‘std::__uninitialized_move_if_noexcept_a<unsigned char*, unsigned char*, std::allocator<unsigned char> >(unsigned char*, unsigned char*, unsigned char*, std::allocator<unsigned char>&)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:397:2,
inlined from ‘std::vector<unsigned char, std::allocator<unsigned char> >::_M_range_insert<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::forward_iterator_tag)void’ at /usr/include/c++/12/bits/vector.tcc:801:9,
inlined from ‘std::vector<unsigned char, std::allocator<unsigned char> >::_M_insert_dispatch<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::__false_type)void’ at /usr/include/c++/12/bits/stl_vector.h:1779:19,
inlined from ‘std::vector<unsigned char, std::allocator<unsigned char> >::insert<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >, void>(__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >)__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >’ at /usr/include/c++/12/bits/stl_vector.h:1481:22,
inlined from ‘isc::dhcp::DUIDFactory::createEN(unsigned int, std::vector<unsigned char, std::allocator<unsigned char> > const&)’ at duid_factory.cc:180:24:
/usr/include/c++/12/bits/stl_algobase.h:431:30: warning: ‘memcpy’ offset 6 is out of the bounds [0, 6] [-Warray-bounds]
431 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/12/bits/stl_algobase.h:431:30: warning: ‘memcpy’ offset 6 is out of the bounds [0, 6] [-Warray-bounds]
...
...
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I../../.. -I../../../src/lib -I../../../src/lib -Wdate-time -D_FORTIFY_SOURCE=2 -DOS_LINUX -I../../.. -I../../.. -Wall -Wextra -Wnon-virtual-dtor -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -pthread -Wno-missing-field-initializers -fPIC -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fdebug-prefix-map=/<<PKGBUILDDIR>>=/usr/src/isc-kea-2.2.0-5ubuntu1 -c ncr_udp.cc -fPIC -DPIC -o .libs/libkea_dhcp_ddns_la-ncr_udp.o
In file included from /usr/include/c++/12/string:50,
from /usr/include/c++/12/bits/locale_classes.h:40,
from /usr/include/c++/12/bits/ios_base.h:41,
from /usr/include/c++/12/ios:42,
from /usr/include/c++/12/ostream:38,
from /usr/include/c++/12/iostream:39,
from ../../../src/lib/cc/data.h:10,
from ../../../src/lib/dhcp_ddns/ncr_msg.h:15,
from ncr_msg.cc:9:
In function ‘std::__copy_move<true, true, std::random_access_iterator_tag>::__copy_m<unsigned char>(unsigned char const*, unsigned char const*, unsigned char*)unsigned char*’,
inlined from ‘std::__copy_move_a2<true, unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:495:30,
inlined from ‘std::__copy_move_a1<true, unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:522:42,
inlined from ‘std::__copy_move_a<true, unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:529:31,
inlined from ‘std::copy<std::move_iterator<unsigned char*>, unsigned char*>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:620:7,
inlined from ‘std::__uninitialized_copy<true>::__uninit_copy<std::move_iterator<unsigned char*>, unsigned char*>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:147:27,
inlined from ‘std::uninitialized_copy<std::move_iterator<unsigned char*>, unsigned char*>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:185:15,
inlined from ‘std::__uninitialized_copy_a<std::move_iterator<unsigned char*>, unsigned char*, unsigned char>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*, std::allocator<unsigned char>&)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:372:37,
inlined from ‘std::__uninitialized_move_if_noexcept_a<unsigned char*, unsigned char*, std::allocator<unsigned char> >(unsigned char*, unsigned char*, unsigned char*, std::allocator<unsigned char>&)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:397:2,
inlined from ‘std::vector<unsigned char, std::allocator<unsigned char> >::_M_range_insert<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::forward_iterator_tag)void’ at /usr/include/c++/12/bits/vector.tcc:801:9,
inlined from ‘std::vector<unsigned char, std::allocator<unsigned char> >::_M_insert_dispatch<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::__false_type)void’ at /usr/include/c++/12/bits/stl_vector.h:1779:19,
inlined from ‘std::vector<unsigned char, std::allocator<unsigned char> >::insert<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, void>(__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >)__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >’ at /usr/include/c++/12/bits/stl_vector.h:1481:22,
inlined from ‘isc::dhcp_ddns::D2Dhcid::fromHWAddr(boost::shared_ptr<isc::dhcp::HWAddr> const&, std::vector<unsigned char, std::allocator<unsigned char> > const&)’ at ncr_msg.cc:144:23:
/usr/include/c++/12/bits/stl_algobase.h:431:30: warning: ‘memcpy’ offset 1 is out of the bounds [0, 1] [-Warray-bounds]
431 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/12/bits/stl_algobase.h:431:30: warning: ‘memcpy’ offset 1 is out of the bounds [0, 1] [-Warray-bounds]
...
...
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I../../.. -I../../../src/lib -I../../../src/lib -I../../../src/bin -I../../../src/bin -Wdate-time -D_FORTIFY_SOURCE=2 -DOS_LINUX -I../../.. -I../../.. -Wall -Wextra -Wnon-virtual-dtor -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -pthread -Wno-missing-field-initializers -fPIC -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fdebug-prefix-map=/<<PKGBUILDDIR>>=/usr/src/isc-kea-2.2.0-5ubuntu1 -c basic_scen.cc -fPIC -DPIC -o .libs/basic_scen.o
In file included from /usr/include/c++/12/memory:63,
from /usr/include/boost/smart_ptr/detail/sp_counted_impl.hpp:35,
from /usr/include/boost/smart_ptr/detail/shared_count.hpp:27,
from /usr/include/boost/smart_ptr/shared_ptr.hpp:17,
from /usr/include/boost/shared_ptr.hpp:17,
from ../../../src/bin/perfdhcp/packet_storage.h:11,
from ../../../src/bin/perfdhcp/test_control.h:10,
from test_control.cc:9:
In function ‘std::__copy_move<true, true, std::random_access_iterator_tag>::__copy_m<unsigned char>(unsigned char const*, unsigned char const*, unsigned char*)unsigned char*’,
inlined from ‘std::__copy_move_a2<true, unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:495:30,
inlined from ‘std::__copy_move_a1<true, unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:522:42,
inlined from ‘std::__copy_move_a<true, unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:529:31,
inlined from ‘std::copy<std::move_iterator<unsigned char*>, unsigned char*>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_algobase.h:620:7,
inlined from ‘std::__uninitialized_copy<true>::__uninit_copy<std::move_iterator<unsigned char*>, unsigned char*>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:147:27,
inlined from ‘std::uninitialized_copy<std::move_iterator<unsigned char*>, unsigned char*>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:185:15,
inlined from ‘std::__uninitialized_copy_a<std::move_iterator<unsigned char*>, unsigned char*, unsigned char>(std::move_iterator<unsigned char*>, std::move_iterator<unsigned char*>, unsigned char*, std::allocator<unsigned char>&)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:372:37,
inlined from ‘std::__uninitialized_move_if_noexcept_a<unsigned char*, unsigned char*, std::allocator<unsigned char> >(unsigned char*, unsigned char*, unsigned char*, std::allocator<unsigned char>&)unsigned char*’ at /usr/include/c++/12/bits/stl_uninitialized.h:397:2,
inlined from ‘std::vector<unsigned char, std::allocator<unsigned char> >::_M_range_insert<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::forward_iterator_tag)void’ at /usr/include/c++/12/bits/vector.tcc:801:9,
inlined from ‘std::vector<unsigned char, std::allocator<unsigned char> >::_M_insert_dispatch<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::__false_type)void’ at /usr/include/c++/12/bits/stl_vector.h:1779:19,
inlined from ‘std::vector<unsigned char, std::allocator<unsigned char> >::insert<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, void>(__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >)__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >’ at /usr/include/c++/12/bits/stl_vector.h:1481:22,
inlined from ‘isc::perfdhcp::TestControl::generateClientId(boost::shared_ptr<isc::dhcp::HWAddr> const&) const’ at test_control.cc:408:21:
/usr/include/c++/12/bits/stl_algobase.h:431:30: warning: ‘memcpy’ offset 1 is out of the bounds [0, 1] [-Warray-bounds]
431 | __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/12/bits/stl_algobase.h:431:30: warning: ‘memcpy’ offset 1 is out of the bounds [0, 1] [-Warray-bounds]
...
I'm nowhere near skilled enough with C++ to determine if this is a false positive from the compiler (or FORTIFY_SOURCE?) and I'm hoping this is a quick and easy one for someone more familiar.
Thanks