| # [FIDL Tuning Proposal](README.md) 006 |
| |
| Programmer Advisory Explicit Defaults |
| |
| Field | Value |
| ----------|-------------------------- |
| Status | Accepted |
| Authors | ianloic@google.com |
| Submitted | 2018-07-20 |
| Reviewed | 2019-01-14 |
| |
| [TOC] |
| |
| # Summary |
| |
| The FIDL specification doesn't state whether primitive and enum struct |
| fields have default values. |
| This tuning proposes that we document explicitly that they do not. |
| |
| # Motivation |
| |
| Requiring initialization is challenging in some languages and impossible |
| in others. |
| This proposal leaves the door open to the lowest common denominator but |
| provides a policy for higher-level languages to follow. |
| |
| The lack of clarity about default values in structs for some types results |
| in some disagreement. |
| Language bindings are inconsistent in their handling of implicit and explicit |
| defaults. |
| It's clear that nullable types default to null and arrays and vectors default |
| to empty but not others. |
| The C++ bindings default primitive types to false, 0 or 0.0 but the Dart |
| bindings require values to be specified when a struct is constructed if no |
| default is supplied in the FIDL definition. |
| |
| Often zero values are great defaults but they should be explicitly declared. |
| For example, if a `uint32_t` is representing an FTP number then 0 |
| isn't a valid value but FIDL has no way to express that a caller should |
| specify a number. |
| |
| # Design |
| |
| This is primarily a documentation clarification. |
| It merely clarifies the semantics expressed in FIDL interfaces. |
| It opens up opportunities for bindings improvements but does not mandate them. |
| |
| The [FIDL language specification][fidl-language] should include the following |
| information, possibly in a different form: |
| |
| |
| > Primitive and enum fields in structs that don't have defaults values |
| > declared in the FIDL file SHOULD be specified when instantiated in |
| > bindings. |
| > Bindings authors MAY respect default values, if the host language makes |
| > that possible, and if that behavior is common and expected by programmers. |
| > For instance, in Dart or C++ it is common to have default values. |
| > In Go however, structs are initialized by default, and the idiomatic pattern |
| > to provide standard initialization is to offer a NewMyStruct() function. |
| > In C, no initialization is expected, instead programmers must explicitly |
| > define all fields. Resorting to a MACRO may be appropriate. |
| > If bindings respect default values, then they: MUST respect all default values |
| > provided, and MUST report an error if a programmer fails to initialize |
| > non-defaulted fields. |
| |
| # Documentation and Examples |
| |
| The language specification and tutorial should be updated to reflect this |
| change. |
| |
| # Backwards Compatibility |
| |
| Existing behavior varies between different language bindings. |
| This change allows all existing behavior and encourages better future behavior. |
| |
| # Performance |
| |
| No impact. |
| |
| # Security |
| |
| This clarifies the specification and makes accidental misuse of interfaces |
| more difficult. |
| These are good for security. |
| |
| # Testing |
| |
| No testing is required. |
| |
| # Drawbacks, Alternatives, and Unknowns |
| |
| An alternative would be to formally define that: |
| |
| ```fidl |
| struct Foo { |
| int32 bar; |
| bool baz; |
| float32 wux; |
| }; |
| ``` |
| |
| is semantically equivalent to: |
| |
| ``` |
| struct Foo { |
| int32 bar = 0; |
| bool baz = false; |
| float32 wux = 0.0; |
| }; |
| ``` |
| |
| but as outlined [above](#motivation) this may fail to capture important semantics. |
| |
| A previous iteration of this proposal included strings but at the time of |
| writing they're still nullable so have a way of indicating that they're |
| required or optional. |
| |
| # Prior Art and References |
| |
| n/a |
| |
| <!-- xrefs --> |
| [fidl-language]: /docs/development/languages/fidl/reference/language.md |