On 09/18/19 17:16, Kinney, Michael D wrote:
>> -----Original Message-----
>> From: Laszlo Ersek <ler...@redhat.com>

>> However, if we wanted to allow new projects to #define
>> STRICTER_UEFI_TYPES as their normal mode of operation
>> (and not just for a sanity check in CI), then we'd have
>> to update the UEFI spec too.
>>
>> Otherwise, code that is technically spec-conformant
>> (albeit semantically nonsensical), like I mentioned up-
>> thread, would no longer compile:
>>
>>   EFI_HANDLE Foobar;
>>   UINT64     Val;
>>
>>   Foobar = &Val;
>
> Does this example build without warnings on all compilers.

I can't test "all" compilers :), but yes, per the C standard, it has to.
"Foobar" is a pointer-to-void, and "&Val" is a
pointer-to-unsigned-long-long. Such an assignment satisfies the
following passages in C99:

6. Language
  6.3 Conversions
    6.3.2 Other operands
      6.3.2.3 Pointers

        1 A pointer to void may be converted to or from a pointer to any
          incomplete or object type. A pointer to any incomplete or
          object type may be converted to a pointer to void and back
          again; the result shall compare equal to the original pointer.

  6.5 Expressions
    6.5.4 Cast operators

      Constraints

      3 Conversions that involve pointers, other than where permitted by
        the constraints of 6.5.16.1, shall be specified by means of an
        explicit cast.

    6.5.16 Assignment operators
      6.5.16.1 Simple assignment

        Constraints

        1 One of the following shall hold:

          [...]

          - one operand is a pointer to an object or incomplete type and
            the other is a pointer to a qualified or unqualified version
            of void, and the type pointed to by the left has all the
            qualifiers of the type pointed to by the right;

          [...]

> I thought we usually have to add some typecasts:
>
>    Foobar = (EFI_HANDLE)&Val;

That's exactly the problem with EFI_HANDLE being a typedef to (void*) --
the explicit cast is not required.

Note the "other than" language in 6.5.4 paragraph 3.

> Or
>
>    Foobar = (EFI_HANDLE)(UINTN)&Val;
>
> For examples like this, adding an explicit typecast would be an
> improvement.  So finding and reviewing and fixing these would be
> a good improvement.

The problem is that the

  Foobar = &Val;

assignment is technically valid, considering both the C standard and the
UEFI spec. Breaking it would be a semantic improvement, but still in
conflict with what UEFI-2.8 promises.

Thanks
Laszlo

-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#47492): https://edk2.groups.io/g/devel/message/47492
Mute This Topic: https://groups.io/mt/34180199/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to