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

Compiler warnings: writing 1 byte into a region of size 0 #8320

Closed
jeffro256 opened this issue May 9, 2022 · 3 comments · Fixed by #8338
Closed

Compiler warnings: writing 1 byte into a region of size 0 #8320

jeffro256 opened this issue May 9, 2022 · 3 comments · Fixed by #8338

Comments

@jeffro256
Copy link
Contributor

After I upgraded my Ubuntu distro to Ubuntu 22, I got the following warnings when compiling:

In file included from /home/jeff/forks/monero/external/boost/archive/portable_binary_oarchive.hpp:32,
                 from /home/jeff/forks/monero/src/p2p/net_peerlist.cpp:37:
In function ‘void boost::archive::reverse_bytes(signed char, char*)’,
    inlined from ‘void boost::archive::portable_binary_oarchive::save_impl(intmax_t, char)’ at /home/jeff/forks/monero/external/boost/archive/portable_binary_oarchive.hpp:267:26:
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;

Here's my system info:

OS: Ubuntu 22
g++: (Ubuntu 11.2.0-19ubuntu1) 11.2.0
CPU: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
@jeffro256
Copy link
Contributor Author

Here is another trace:

In function ‘void boost::archive::reverse_bytes(signed char, char*)’,
    inlined from ‘void boost::archive::portable_binary_iarchive::load_impl(intmax_t&, char)’ at /home/jeff/forks/monero/external/boost/archive/portable_binary_iarchive.hpp:265:18,
    inlined from ‘void boost::archive::portable_binary_iarchive::load(T&) [with T = boost::serialization::collection_size_type]’ at /home/jeff/forks/monero/external/boost/archive/portable_binary_iarchive.hpp:108:18,
    inlined from ‘static void boost::archive::load_access::load_primitive(Archive&, T&) [with Archive = boost::archive::portable_binary_iarchive; T = boost::serialization::collection_size_type]’ at /usr/include/boost/archive/detail/iserializer.hpp:108:16,
    inlined from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::load_primitive::invoke(Archive&, T&) [with T = boost::serialization::collection_size_type; Archive = boost::archive::portable_binary_iarchive]’ at /usr/include/boost/archive/detail/iserializer.hpp:384:40,
    inlined from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = boost::serialization::collection_size_type; Archive = boost::archive::portable_binary_iarchive]’ at /usr/include/boost/archive/detail/iserializer.hpp:461:22,
    inlined from ‘void boost::archive::load(Archive&, T&) [with Archive = boost::archive::portable_binary_iarchive; T = boost::serialization::collection_size_type]’ at /usr/include/boost/archive/detail/iserializer.hpp:624:18,
    inlined from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&) [with T = boost::serialization::collection_size_type; Archive = boost::archive::portable_binary_iarchive]’ at /usr/include/boost/archive/detail/common_iarchive.hpp:67:22,
    inlined from ‘void boost::archive::portable_binary_iarchive::load_override(T&) [with T = boost::serialization::collection_size_type]’ at /home/jeff/forks/monero/external/boost/archive/portable_binary_iarchive.hpp:160:52,
    inlined from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = boost::serialization::collection_size_type; Archive = boost::archive::portable_binary_iarchive]’ at /usr/include/boost/archive/detail/interface_iarchive.hpp:68:36,
    inlined from ‘void boost::serialization::load(Archive&, boost::serialization::nvp<T>&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; T = boost::serialization::collection_size_type]’ at /usr/include/boost/serialization/nvp.hpp:56:8,
    inlined from ‘static void boost::serialization::free_loader<Archive, T>::invoke(Archive&, T&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; T = boost::serialization::nvp<boost::serialization::collection_size_type>]’ at /usr/include/boost/serialization/split_free.hpp:58:13,
    inlined from ‘void boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; T = boost::serialization::nvp<boost::serialization::collection_size_type>]’ at /usr/include/boost/serialization/split_free.hpp:74:18,
    inlined from ‘void boost::serialization::serialize(Archive&, boost::serialization::nvp<T>&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; T = boost::serialization::collection_size_type]’ at /usr/include/boost/serialization/nvp.hpp:65:15,
    inlined from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; T = boost::serialization::nvp<boost::serialization::collection_size_type>]’ at /usr/include/boost/serialization/serialization.hpp:118:14,
    inlined from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::load_only::invoke(Archive&, const T&) [with T = boost::serialization::nvp<boost::serialization::collection_size_type>; Archive = boost::archive::portable_binary_iarchive]’ at /usr/include/boost/archive/detail/iserializer.hpp:395:48,
    inlined from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = const boost::serialization::nvp<boost::serialization::collection_size_type>; Archive = boost::archive::portable_binary_iarchive]’ at /usr/include/boost/archive/detail/iserializer.hpp:461:22,
    inlined from ‘void boost::archive::load(Archive&, T&) [with Archive = boost::archive::portable_binary_iarchive; T = const boost::serialization::nvp<boost::serialization::collection_size_type>]’ at /usr/include/boost/archive/detail/iserializer.hpp:624:18,
    inlined from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&) [with T = const boost::serialization::nvp<boost::serialization::collection_size_type>; Archive = boost::archive::portable_binary_iarchive]’ at /usr/include/boost/archive/detail/common_iarchive.hpp:67:22,
    inlined from ‘void boost::archive::portable_binary_iarchive::load_override(T&) [with T = const boost::serialization::nvp<boost::serialization::collection_size_type>]’ at /home/jeff/forks/monero/external/boost/archive/portable_binary_iarchive.hpp:160:52,
    inlined from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const boost::serialization::nvp<boost::serialization::collection_size_type>; Archive = boost::archive::portable_binary_iarchive]’ at /usr/include/boost/archive/detail/interface_iarchive.hpp:68:36,
    inlined from ‘void boost::serialization::load(Archive&, std::vector<U, Allocator>&, unsigned int, mpl_::false_) [with Archive = boost::archive::portable_binary_iarchive; U = crypto::public_key; Allocator = std::allocator<crypto::public_key>]’ at /usr/include/boost/serialization/vector.hpp:84:8,
    inlined from ‘void boost::serialization::load(Archive&, std::vector<U, Allocator>&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; U = crypto::public_key; Allocator = std::allocator<crypto::public_key>]’ at /usr/include/boost/serialization/vector.hpp:165:9,
    inlined from ‘static void boost::serialization::free_loader<Archive, T>::invoke(Archive&, T&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; T = std::vector<crypto::public_key>]’ at /usr/include/boost/serialization/split_free.hpp:58:13,
    inlined from ‘void boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; T = std::vector<crypto::public_key>]’ at /usr/include/boost/serialization/split_free.hpp:74:18,
    inlined from ‘void boost::serialization::serialize(Archive&, std::vector<U, Allocator>&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; U = crypto::public_key; Allocator = std::allocator<crypto::public_key>]’ at /usr/include/boost/serialization/vector.hpp:176:37,
    inlined from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::portable_binary_iarchive; T = std::vector<crypto::public_key>]’ at /usr/include/boost/serialization/serialization.hpp:118:14,
    inlined from ‘void boost::archive::detail::iserializer<Archive, T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive::portable_binary_iarchive; T = std::vector<crypto::public_key>]’ at /usr/include/boost/archive/detail/iserializer.hpp:187:40:
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:48:15: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   48 |         *last = *first;
      |         ~~~~~~^~~~~~~~
/home/jeff/forks/monero/external/boost/archive/portable_binary_archive.hpp:49:16: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
   49 |         *first = x;
      |         ~~~~~~~^~~

@moneromooo-monero
Copy link
Collaborator

AFAICT it's fine and ASAN doesn't complain on:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

inline void
reverse_bytes(signed char size, char *address){
    if (size <= 0)
        printf("BEEP\n");
    char * first = address;
    char * last = first + size - 1;
    for(;first < last;++first, --last){
        char x = *last;
        *last = *first;
        *first = x;
    }
}

int main()
{
  for (int i = 1; i <= 127; ++i)
  {
    char *str = (char*)malloc(i);
    reverse_bytes(i, str);
    free(str);
  }
  return 9;
}

@Xeverous
Copy link

I know it's late but FYI I got the same weird warning on my own project which uses high-level C++ (no memcpy / byte stuff), it points to random types and totally sane operations like ctor member init list (which can not cause undefined behavior).

Searching GCC bugzilla with this warning gives me 8 results, many on totally bug-free code. Fixes generally include tweaking optimization options.

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 a pull request may close this issue.

5 participants
@moneromooo-monero @jeffro256 @Xeverous and others