Nearly 5 years later, I found myself having the same problem. 
 Perfectly-valid serialized protobufs generated in C++ for message types 
with no required fields suddenly started throwing 
"InvalidProtocolBufferException: Message was missing required fields." 
exceptions in Java.

The problem is, as far as I can tell, a bug in the Dalvik JIT.  I've never 
seen in in ARM devices, but have seen it in x86 on Android 4.4.4. 
 Disabling the JIT (setting "android:vmSafeMode" to true in the 
AndroidManifest.xml) resolves the problem.

It all comes down to a sign extension bug in the following code:

 private byte memoizedIsInitialized = -1;
    public final boolean isInitialized() {
      byte isInitialized = memoizedIsInitialized;
      if (isInitialized != -1) return isInitialized == 1;

      memoizedIsInitialized = 1;
      return true;
    }

The value of isInitialized will be implicitly converted to an int (for 
comparison to -1 and 1) and, in certain cases, won't be sign extended, 
giving a value of 255.  This in turn causes the function to return false. 
 This bug appears to be completely random, and doesn't require racing 
threads.  I don't know if this bug is during the initial store of the field 
or in the subsequent load, exactly.

A simple workaround is to modify the compiler output to make both 
memoizedIsInitialized and isInitalized into ints. This avoids any need for 
casting or sign extension.

On Monday, April 19, 2010 at 10:51:14 AM UTC-7, Kenton Varda wrote:
>
> If Henner's answer didn't help, you'll need to provide a small, 
> self-contained example which reproduces the problem.
>
> On Fri, Apr 16, 2010 at 11:05 AM, SyRenity <stas....@gmail.com 
> <javascript:>> wrote:
>
>> Hi.
>>
>> I'm getting occasionally the following error below in my Java app:
>>
>> com.google.protobuf.InvalidProtocolBufferException: Message was
>> missing required fields.  (Lite runtime could not determine which
>> fields were missing).
>>        at
>>
>> com.google.protobuf.UninitializedMessageException.asInvalidProtocolBufferException(UninitializedMessageException.java:
>> 81)
>>        at classes.cameraInfoProto$camera
>> $Builder.buildParsed(cameraInfoProto.java:242)
>>        at classes.cameraInfoProto$camera$Builder.access
>> $11(cameraInfoProto.java:238)
>>        at classes.cameraInfoProto
>> $camera.parseFrom(cameraInfoProto.java:133)
>>        at app.jSockets.FetcherSockets
>> $ResponseThread.readMessage(FetcherSockets.java:386)
>>        at app.jSockets.FetcherSockets
>> $ResponseThread.run(FetcherSockets.java:268)
>>
>>
>> I double-checked my code, but I have only a single required field, and
>> I'm always filling it up in the C++ app.
>>
>> Any idea how to diagnose it?
>>
>> Thanks.
>>
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "Protocol Buffers" group.
>> To post to this group, send email to prot...@googlegroups.com 
>> <javascript:>.
>> To unsubscribe from this group, send email to 
>> protobuf+u...@googlegroups.com <javascript:>.
>> For more options, visit this group at 
>> http://groups.google.com/group/protobuf?hl=en.
>>
>>
>  -- 
> You received this message because you are subscribed to the Google Groups 
> "Protocol Buffers" group.
> To post to this group, send email to prot...@googlegroups.com 
> <javascript:>.
> To unsubscribe from this group, send email to 
> protobuf+u...@googlegroups.com <javascript:>.
> For more options, visit this group at 
> http://groups.google.com/group/protobuf?hl=en.
>

-- 
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 post to this group, send email to protobuf@googlegroups.com.
Visit this group at http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to