- assigned_to: mbsdf
Originally created by: MonsieurNicolas
Originally owned by: mbsdf
I am seeing a bunch of warnings related to using the binary flavor of cereal.
/src/stellar-core/lib/xdrpp/xdrpp/cereal.h(109,16): warning C4244: 'argument': conversion from 'cereal::size_type' to 'uint32_t', possible loss of data (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(941,1): message : see reference to function template instantiation 'void xdr::detail::load<AA,TT>(Archive &,T &)' being compiled
with
[
AA=cereal::BinaryInputArchive,
TT=xdr::opaque_array<32>,
Archive=cereal::BinaryInputArchive,
T=xdr::opaque_array<32>
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(853,1): message : see reference to function template instantiation 'ArchiveType &cereal::InputArchive<ArchiveType,1>::processImpl<xdr::opaque_array<32>,(cereal::traits::detail::sfinae)0>(T &)' being compiled
with
[
ArchiveType=cereal::BinaryInputArchive,
T=xdr::opaque_array<32>
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(853,26): message : see reference to function template instantiation 'ArchiveType &cereal::InputArchive<ArchiveType,1>::processImpl<xdr::opaque_array<32>,(cereal::traits::detail::sfinae)0>(T &)' being compiled
with
[
ArchiveType=cereal::BinaryInputArchive,
T=xdr::opaque_array<32>
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(729): message : see reference to function template instantiation 'void cereal::InputArchive<cereal::BinaryInputArchive,1>::process<xdr::opaque_array<32>&>(T)' being compiled
with
[
T=xdr::opaque_array<32> &
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(730,16): message : see reference to function template instantiation 'void cereal::InputArchive<cereal::BinaryInputArchive,1>::process<xdr::opaque_array<32>&>(T)' being compiled
with
[
T=xdr::opaque_array<32> &
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/xdrpp/xdrpp/types.h(132,1): message : see reference to function template instantiation 'ArchiveType &cereal::InputArchive<ArchiveType,1>::operator ()<xdr::opaque_array<32>&>(xdr::opaque_array<32> &)' being compiled
with
[
ArchiveType=cereal::BinaryInputArchive
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/xdrpp/xdrpp/types.h(132,7): message : see reference to function template instantiation 'ArchiveType &cereal::InputArchive<ArchiveType,1>::operator ()<xdr::opaque_array<32>&>(xdr::opaque_array<32> &)' being compiled
with
[
ArchiveType=cereal::BinaryInputArchive
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/xdrpp/xdrpp/types.h(147,1): message : see reference to function template instantiation 'void xdr::archive_adapter<Archive>::apply<xdr::opaque_array<32>&>(Archive &,T,const char *)' being compiled
with
[
Archive=cereal::BinaryInputArchive,
T=xdr::opaque_array<32> &
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/xdrpp/xdrpp/types.h(147,34): message : see reference to function template instantiation 'void xdr::archive_adapter<Archive>::apply<xdr::opaque_array<32>&>(Archive &,T,const char *)' being compiled
with
[
Archive=cereal::BinaryInputArchive,
T=xdr::opaque_array<32> &
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/Builds/VisualStudio/src/DebugNoPostgres/generated/xdr/Stellar-ledger-entries.h(5844,1): message : see reference to function template instantiation 'void xdr::archive<Archive,stellar::PoolID&>(Archive &,T,const char *)' being compiled
with
[
Archive=cereal::BinaryInputArchive,
T=stellar::PoolID &
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/xdrpp/xdrpp/cereal.h(51,1): message : see reference to function template instantiation 'void xdr::xdr_traits<stellar::LedgerKey::_liquidityPool_t>::load<Archive>(Archive &,stellar::LedgerKey::_liquidityPool_t &)' being compiled
with
[
Archive=cereal::BinaryInputArchive
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(941,1): message : see reference to function template instantiation 'void xdr::detail::load<AA,TT>(Archive &,T &)' being compiled
with
[
AA=cereal::BinaryInputArchive,
TT=stellar::LedgerKey::_liquidityPool_t,
Archive=cereal::BinaryInputArchive,
T=stellar::LedgerKey::_liquidityPool_t
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(853,1): message : see reference to function template instantiation 'ArchiveType &cereal::InputArchive<ArchiveType,1>::processImpl<F,(cereal::traits::detail::sfinae)0>(T &)' being compiled
with
[
ArchiveType=cereal::BinaryInputArchive,
F=stellar::LedgerKey::_liquidityPool_t,
T=stellar::LedgerKey::_liquidityPool_t
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(853,26): message : see reference to function template instantiation 'ArchiveType &cereal::InputArchive<ArchiveType,1>::processImpl<F,(cereal::traits::detail::sfinae)0>(T &)' being compiled
with
[
ArchiveType=cereal::BinaryInputArchive,
F=stellar::LedgerKey::_liquidityPool_t,
T=stellar::LedgerKey::_liquidityPool_t
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(729): message : see reference to function template instantiation 'void cereal::InputArchive<cereal::BinaryInputArchive,1>::process<F&>(T)' being compiled
with
[
F=stellar::LedgerKey::_liquidityPool_t,
T=stellar::LedgerKey::_liquidityPool_t &
] (compiling source file ../../src/bucket/BucketIndexImpl.cpp)
/src/stellar-core/lib/cereal/include/cereal/cereal.hpp(730,16): message : see reference to function template instantiation 'void cereal::InputArchive<cereal::BinaryInputArchive,1>::process<F&>(T)' being compiled
it looks like this code path in xdrpp etc was never hit before, and could be the sign of an actual problem.
From a quick glance, it looks to be related to some implementations that are using the wrong types, such as xdr::xarray:
static void check_size(uint32_t i) {
if (i != N)
throw xdr_overflow("invalid size in xdr::xarray");
}
static void resize(uint32_t i) {
if (i != N)
throw xdr_overflow("invalid resize in xdr::xarray");
}
T &extend_at(uint32_t i) {
if (i >= N)
throw xdr_overflow("attempt to access invalid position in xdr::xarray");
return (*this)[i];
}
I think it would be cleaner if it was something like
static Constexpr std::size_t size() { return N; }
static void validate() {}
static void check_size(std::size_t i) {
if (i != N)
throw xdr_overflow("invalid size in xdr::xarray");
}
so that N's type is an internal detail, making check_size consistent with what size() returns.
Note that other types like xvector uses size_t already in those places.
I opened https://github.com/xdrpp/xdrpp/pull/35 that fixes the problem (but needs to be merged before we can address this here)