[libcamera-devel] [PATCH 06/31] libcamera: ipa: Test control structure size with static_assert

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Mar 5 10:50:57 CET 2020


Hi Laurent,

On 03/03/2020 17:48, Laurent Pinchart wrote:
> Hi Kieran,
> 
> On Mon, Mar 02, 2020 at 10:49:01PM +0000, Kieran Bingham wrote:
>> On 29/02/2020 16:42, Laurent Pinchart wrote:
>>> The control-related structures ipa_controls_header,
>>> ipa_control_value_entry and ipa_control_range_entry define the IPA
>>> protocol and are thus part of the ABI. To avoid breaking it
>>> inadvertently, use static_assert() to check the size of the structures.
>>>
>>> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>>
>> Some suggestions but otherwise...
>>
>> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>
>>> ---
>>>  src/libcamera/ipa_controls.cpp | 9 +++++++++
>>>  1 file changed, 9 insertions(+)
>>>
>>> diff --git a/src/libcamera/ipa_controls.cpp b/src/libcamera/ipa_controls.cpp
>>> index dd3ff9a0d467..25f38bab3dd9 100644
>>> --- a/src/libcamera/ipa_controls.cpp
>>> +++ b/src/libcamera/ipa_controls.cpp
>>> @@ -153,6 +153,9 @@
>>>   * Reserved for future extensions
>>>   */
>>>  
>>> +static_assert(sizeof(ipa_controls_header) == 32,
>>> +	      "Invalid size for struct ipa_control_header");
>>> +
>>
>> I think this could be better worded to be more helpful in the event that
>> it is changed:
>>
>> "Invalid ABI size change for struct ...."
>>
>>>  /**
>>>   * \struct ipa_control_value_entry
>>>   * \brief Description of a serialized ControlValue entry
>>> @@ -167,6 +170,9 @@
>>>   * value data (shall be a multiple of 8 bytes).
>>>   */
>>>  
>>> +static_assert(sizeof(ipa_control_value_entry) == 16,
>>> +	      "Invalid size for struct ipa_control_value_entry");
>>> +
>>>  /**
>>>   * \struct ipa_control_range_entry
>>>   * \brief Description of a serialized ControlRange entry
>>> @@ -180,3 +186,6 @@
>>>   * \var ipa_control_range_entry::padding
>>>   * Padding bytes (shall be set to 0)
>>>   */
>>> +
>>> +static_assert(sizeof(ipa_control_range_entry) == 16,
>>> +	      "Invalid size for struct ipa_control_range_entry");
>>>
>>
>>
>> If we're going to do lots of validating of structure sizes with a
>> repeatable message, perhaps it warrants a macro:
>>
>> ASSERT_ABI_SIZE(struct ipa_controls_header, 32);
>> ASSERT_ABI_SIZE(struct ipa_control_value_entry, 16);
>> ASSERT_ABI_SIZE(struct ipa_control_range_entry, 16);
> 
> It's a good idea, but we will also likely need to statically assert that
> the offset of indidivual fields doesn't change, so I think more thoughts
> are required on how to create such macros.

Well that will then become:

ASSERT_ABI_OFFSET(s, m, o)

I still think macroising will simplify things.


-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list