[PATCH v4 7/8] gdb/testsuite: Add unittest for qIsAddressTagged packet

Gustavo Romero gustavo.romero@linaro.org
Wed Apr 17 19:11:10 GMT 2024



On 4/17/24 4:03 PM, Gustavo Romero wrote:
> Hi Luis,
> 
> On 4/17/24 6:38 AM, Luis Machado wrote:
>> Hi,
>>
>> A few comments, mostly dependent on the previous patch's (06/08) behavior.
>>
>> On 4/16/24 15:07, Gustavo Romero wrote:
>>> Add unittests for testing qIsAddressTagged packet request creation and
>>> reply checks.
>>>
>>> Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
>>> ---
>>>   gdb/remote.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>>>   1 file changed, 42 insertions(+)
>>>
>>> diff --git a/gdb/remote.c b/gdb/remote.c
>>> index 63799ac5e3f..42f34a03c95 100644
>>> --- a/gdb/remote.c
>>> +++ b/gdb/remote.c
>>> @@ -15658,6 +15658,8 @@ test_memory_tagging_functions ()
>>>     scoped_restore restore_memtag_support_
>>>       = make_scoped_restore (&config->support);
>>> +  struct gdbarch *gdbarch = current_inferior ()->arch ();
>>> +
>>>     /* Test memory tagging packet support.  */
>>>     config->support = PACKET_SUPPORT_UNKNOWN;
>>>     SELF_CHECK (remote.supports_memory_tagging () == false);
>>> @@ -15724,6 +15726,46 @@ test_memory_tagging_functions ()
>>>     create_store_memtags_request (packet, 0xdeadbeef, 255, 1, tags);
>>>     SELF_CHECK (memcmp (packet.data (), expected.c_str (),
>>>                 expected.length ()) == 0);
>>> +
>>> +  /* Test creating a qIsAddressTagged request.  */
>>> +  expected = "qIsAddressTagged:deadbeef";
>>> +  create_is_address_tagged_request (gdbarch, packet, 0xdeadbeef);
>>> +  SELF_CHECK (strcmp (packet.data (), expected.c_str ()) == 0);
>>> +
>>> +  /* Test empty reply on qIsAddressTagged request.  */
>>> +  reply = "E00";
>>
>> The comment seems to be out of sync with what's being tested. Should we be
>> testing an empty reply instead of E00?
> 
> Right, just noticed that too. Fixed in v5, thanks.
> 
> 
>>> +  /* is_tagged must not changed, hence it's tested too.  */
>>
>> s/must not changed/must not change
>>
>>> +  bool is_tagged = false;
>>> +  strcpy (packet.data (), reply.c_str ());
>>> +  SELF_CHECK (check_is_address_tagged_reply (packet, &is_tagged) == false);
>>> +  SELF_CHECK (is_tagged == false);
>>> +
>>> +  /* Test if only the first byte (01) is correctly extracted from a long
>>> +     numerical reply, with remaining garbage.  */
>>> +  reply = "0104A590001234006mC0fe";
>>> +  /* Because the first byte is 01, is_tagged should be set to true.  */
>>> +  is_tagged = false;
>>> +  strcpy (packet.data (), reply.c_str ());
>>> +  SELF_CHECK (check_is_address_tagged_reply (packet, &is_tagged) == true);
>>
>> I think this particular reply (malformed) should make the packet check fail, as
>> we risk the remote returning garbage values and things working just because the
>> first byte was the expected number.
>>
>> We should be more strict with the packet reply format and check its length.
>>
>>> +  SELF_CHECK (is_tagged == true);
>>> +
>>> +  /* Test if only the first byte (00) is correctly extracted from a long
>>> +     numerical reply, with remaining garbage.  */
>>> +  reply = "0004A590001234006mC0fe";
>>> +  /* Because the first byte is 00, is_tagged should be set to false.  */
>>> +  is_tagged = true;
>>> +  strcpy (packet.data (), reply.c_str ());
>>> +  SELF_CHECK (check_is_address_tagged_reply (packet, &is_tagged) == true);
>>> +  SELF_CHECK (is_tagged == false);
>>
>> Same case for the above test.
>>
>>> +
>>> +  /* Test if only the first byte, 04, is correctly extracted and recognized
>>> +     as invalid (only 00 and 01 are valid replies).  */
>>> +  reply = "0404A590001234006mC0fe";
>>> +  /* Because the first byte is invalid is_tagged must not change.  */
>>> +  is_tagged = false;
>>> +  strcpy (packet.data (), reply.c_str ());
>>> +  SELF_CHECK (check_is_address_tagged_reply (packet, &is_tagged) == false);
>>> +  SELF_CHECK (is_tagged == false);
>>>   }
>>>   static void
>>
>> Also a similar situation.
>>
>> We should exercise the following:
>>
>> - Empty reply
>> - Not tagged - "00"
>> - Tagged - "01"
>> - Error - "E??"
>> - Malformed - packets of incorrect length and values.
> 
> I agree, but regarding the malformed case due to an incorrect length,
> in check_is_address_tagged_reply we explicitly request to convert
> only one byte in hex format (2 hex digits):
> 
>    /* Convert only 2 hex digits, i.e. 1 byte in hex format.  */
>    hex2bin (packet.data (), &reply, 1);
> 
> so the rest is truncated. I can add a test to verify if truncation is right,
> for instance: "0104A590001234006mC0fe" should returned "Tagged". I don't
> think it's worth checking for length in the code.
> 
> So, how about:
> 
> Empty reply
> Not tagged - "00"
> Tagged - "01"
> Error - "E00"
> Malformed, length truncation - "0104A590001234006"
> Malformed, values - "0m" (not a hex value)

ah, and an invalid reply as well, like 04 (which is neither 00 nor 01), so:

Empty reply - ""
Not tagged - "00"
Tagged - "01"
Invalid - "04"
Error - "E00"
Malformed, length truncation - "0104A590001234006"
Malformed, values - "0m" (not a hex value)


Cheers,
Gustavo


More information about the Gdb-patches mailing list