...
std::array<unsigned char, 65> signature_data;
int recovery_id = 0;
secp256k1_ecdsa_recoverable_signature_serialize_compact(
secp_ctx(), signature_data.data(), &recovery_id, &signature);
signature_data.back() = static_cast<unsigned char>(recovery_id);
BinaryDataPtr result;
make_binary_data_from_bytes(
signature_data.data(), signature_data.size(),
reset_sp(result)));
...
The signature_data.data() will be truncated when signature_data has '\0' .
This rarely happens, but unfortunately it does.