[PATCH v2] tests/validation: Fix 64bit test failure
Kinsey Moore
kinsey.moore at oarcorp.com
Mon Feb 15 22:10:14 UTC 2021
On Mon, 2021-02-15 at 3:35pm, Martin Erik Werner wrote:
> On Mon, 2021-02-15 at 09:19 -0600, Kinsey Moore wrote:
>> From: Ryan Long <ryan.long at oarcorp.com>
>>
>> The ts-validation-0 test currently fails on 64bit BSPs due to a
>> limitation of the message structure. Changing the max message size to a
>> size_t type and adjusting the expected value in the test resolves this.
>
> This talks about the message size, but the change is to the pending
> count?
You're correct, the change is for maximum_pending_messages, not
maximum_message_size. I was looking at other parts of the code when I
rewrote parts of this commit message this morning.
>> Closes #4179.
> This seems to be the wrong bug reference, is #4197 the correct one?
Also correct, I'll fix this.
> If this change is correct there are a couple of casts left over now
> which maybe should be adjusted as well?:
>
> cpukit/score/src/coremsg.c:64: (size_t) maximum_pending_messages * buffer_size,
> cpukit/score/src/coremsg.c:89: (size_t) maximum_pending_messages,
I'll fix this pending the results of commentary below.
> I'm however wondering if this is the right way to fix this...
>
> I'm guessing that the failure mentioned is based on this specification
> in rtems-central : spec/rtems/message/req/construct-errors.yml
>
> 393 - enabled-by: true
> 394 post-conditions:
> 395 Status: InvNum
> 396 pre-conditions:
> 397 Area: all
> 398 AreaSize: all
> 399 Id:
> 400 - Id
> 401 MaxPending:
> 402 - Big
> 403 MaxSize:
> 404 - Valid
> 405 Name:
> 406 - Valid
> 407 Queues:
> 408 - Avail
>
> Which in practice seems to specify that
>
> rtems_message_queue_create
> (
> name,
> UINT32_MAX /* count */,
> 1 /* size */,
> attribute_set,
> &id
> );
>
> must fail with RTEMS_INVALID_NUMBER due to
>
> 117 - name: Big
> 118 test-code: |
> 119 ctx->config.maximum_pending_messages = UINT32_MAX;
> 120 text: |
> 121 The maximum number of pending messages of the message queue configuration
> 122 shall be big enough so that a calculation to get the message buffer
> 123 storage area size overflows.
>
> which in the code looks like
>
> /* Make sure the memory allocation size computation does not overflow */
> if ( maximum_pending_messages > SIZE_MAX / buffer_size ) {
> return STATUS_MESSAGE_QUEUE_INVALID_NUMBER;
> }
>
> But when the SIZE_MAX is a 64bit size_t, then UINT32_MAX * (1 + buffer
> overhead) cannot reasonably overflow SIZE_MAX, so this will report
> success instead of the expected invalid number which is the failure
> seen in the validation test, is that correct?
That's correct.
> If so, it seems very odd to change the interface just to allow this
> failure to occur.
>
> Would it be possible to instead specify that if
>
> SIZE_MAX >= UINT32_MAX * (1 + buffer overhead)
>
> then this case should be skipped, or expects success?
Expecting success would be the easier tack given how the test is configured. It just seemed
odd to expect a different result of a unit test because the size of void* changed, especially
so when I'm comparing the behavior of two mulitilibs on the same hardware.
Kinsey
More information about the devel
mailing list