Hi Feng,

Thanks for answering.

As suggested by the official documentation:
https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#enum
We can handle the unknown enum value through either a `default` clause or 
an `if` check as follows:

// Wrong version of client-side code:
int HandleFoo(Foo foo) {
  if (Foo::Type_IsValid(foo.type()) {
    switch (foo.type()) {
      case FOO: return ...;
      case BAR: return ...;
      case google::protobuf::kint32min:
      case google::protobuf::kint32max:
        // UNREACHABLE.
    }
  } else {
    // Handle the unknown enum value properly.
  }
}

So this way we can ensure that the unknown enum values are handled,
and also the compiler can check if an enum value is missing in the `switch` 
statement for us.
Is it future-proof to use `google::protobuf::kint32max` or 
`*_INT_MAX_SENTINEL_DO_NOT_USE_`?
It seems to me that there's some merit to formalize this in the proto3 
language. Thoughts?

Best,
Chun-Hung


On Monday, October 30, 2017 at 12:29:26 PM UTC-7, Feng Xiao wrote:
>
>
>
> On Mon, Oct 30, 2017 at 9:57 AM, <[email protected] <javascript:>> 
> wrote:
>
>> Hi all,
>>
>> I'm from the Apache Mesos community and we're working on things that uses 
>> proto3.
>> We usually turn on compiler options to report missing values in switch 
>> statements,
>> and don't do a "default" clause. This gives us the benefit of capturing 
>> missing enum
>> values during compile time. However, it seems that for proto3's open enum 
>> values,
>> we need to either manually adding those `*_INT_MAX_SENTINEL_DO_NOT_USE_` 
>> values
>> in switch statements, or add a default clause to avoid such errors but 
>> then we lose
>> the benefit I mentioned above. It seems that the compiler is not clever 
>> enough
>> to infer that clauses for those sentinel values are not needed for switch 
>> statements
>> that are inside `if(Enum_IsValid(...))` statements.
>>
>> My question is, what's the best practice if I don't want to add a default 
>> clause?
>> Is it safe to add either `*_INT_MAX_SENTINEL_DO_NOT_USE_` symbols
>> or `google::protobuf::kint32max` into switch statements, such that these 
>> will
>> remain unchanged in future versions of protobuf library? Or is there a 
>> better way
>> to address this?
>>
> The recommendation is to always have a default case when handling proto3 
> enums. Unlike regular enums that fall in a defined list of possible values, 
> proto3 enums can have unrecognized values when a client receives data from 
> a remote server with a new enum definition. To ensure such unrecognized 
> values are correctly handled, a default case must be added.
>
> For example, suppose you have a client built with such a proto:
> message Foo {
>   enum Type {
>     FOO = 0;
>     BAR = 1;
>   }
>   Type type = 1;
> }
>
> and later someone adds a new value into the enum and uses the new 
> definition on the server side:
> message Foo {
>   enum Type {
>     FOO = 0;
>     BAR = 1;
>     BAZ = 2;
>   }
>   Type type = 1;
> }
>
> If your client receives data from the server with type = BAZ, foo.type() 
> will return 2, which you can't catch with any predefined values. If you 
> don't have default case, undefined behavior ensures.
>
> // Wrong version of client-side code:
> int HandleFoo(Foo foo) { 
>   switch (foo.type()) {
>     case FOO: return ...;
>     case BAR: return ...;
>     case *_INT_MAX_SENTINEL_DO_NOT_USE: return ...;
>   }
>   // You can never get here, or maybe you can?
> }
>
> // The correct version
> int HandleFoo(Foo foo) { 
>   switch (foo.type()) {
>     case FOO: return ...;
>     case BAR: return ...;
>     default: return ...;  // There is an enum value we don't know about, 
> handle it appropriately.
>   }
>   // You can never get here.
> }
>  
>
>>
>> Thanks,
>> Chun-Hung
>>
>> --
>> 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 [email protected] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/protobuf.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

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

Reply via email to