Greetings, We are seeing a weird behavior that when we compile the *pb.cc generated with a v3.19.4 protobuf that the variadic template function gets called, the args seems to be passed incorrectly. We are not sure if it' a compiler issue or protobuf issue. The same *pb.cc can be compiled and run correctly with GCC but it will crash with Clang.
I will share some code snippet on the generated code.. ``` template <typename ArgT0, typename... ArgT> inline PROTOBUF_ALWAYS_INLINE void BaseCVRequest::set_requestid(ArgT0&& arg0, ArgT... args) { requestid_.Set(::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::EmptyDefault{}, static_cast<ArgT0 &&>(arg0), args..., GetArenaForAllocation()); // @@protoc_insertion_point(field_set:cvclient.data.request.BaseCVRequest.requestId) } ``` Our test program is straightforward and we've confirmed GetArenaForAllocation() does return nullptr for both GCC and Clang compiled test program (which listed below). ``` #include <iostream> #include "CVServiceRequest.pb.h" static const std::string CVS_REQUEST_DUMMY_ID = "123"; using namespace cvclient::data::request; int main(int args, char** argv) { GOOGLE_PROTOBUF_VERIFY_VERSION; std::cout << "Hello World" << std::endl; CVInternalRequest internalRequest; internalRequest.mutable_basecvrequest()->set_requestid(CVS_REQUEST_DUMMY_ID); } ``` We would hit a SEGB in set_requestid() beacuse the arena pointer is bogus. BaseCVRequest is within CVInternalRequest. What seems to happen is GetArenaForAllocation() returns nullptr, but when it gets call into arenastring's Set function, it become a bogus pointer. ``` google::protobuf::internal::ArenaStringPtr::Set (this=0x46be50, value=..., arena=0x460014) at google/protobuf/arenastring.cc:102 Python Exception <class 'ModuleNotFoundError'>: No module named 'gdb.styling' 102 Set(&GetEmptyStringAlreadyInited(), value, arena); (gdb) list 97 } 98 } 99 100 void ArenaStringPtr::Set(EmptyDefault, ConstStringParam value, 101 ::google::protobuf::Arena* arena) { 102 Set(&GetEmptyStringAlreadyInited(), value, arena); 103 } 104 105 void ArenaStringPtr::Set(EmptyDefault, std::string&& value, 106 ::google::protobuf::Arena* arena) { (gdb) p value $1 = (google::protobuf::ConstStringParam) <error reading variable: Cannot access memory at address 0x0> (gdb) ``` The libprotobuf.so shared lib on our target i s GCC-V11.2 built. Has anyone encountered similar issue. Thanks, Mike -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to protobuf+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/protobuf/1827e2f0-617f-4f6c-87ed-c60214862dd9n%40googlegroups.com.