ecb3298 DO NOT APPLY: edk2: turn standard handle types into pointers to non-VOID

Authored and Committed by lersek 4 years ago
    DO NOT APPLY: edk2: turn standard handle types into pointers to non-VOID
    
    Unfortunately, the UEFI / PI / Shell specs define a number of handle types
    as pointers to VOID. This is a design mistake; those types should have
    been pointers to incomplete union or structure types. Any
    pointer-to-object type converts implicitly to, and from, pointer-to-void,
    which prevents compilers from catching at least the following two types of
    mistakes:
    
    - mixing up one handle type with another (for example, EFI_HANDLE with
      EFI_EVENT),
    
    - getting the depth of indirection wrong (for example, mixing up
      (EFI_HANDLE*) with EFI_HANDLE).
    
    In order to root out such mistakes in the edk2 codebase, introduce
    incomplete structure types with unique tags, such as:
    
      struct EFI_FOOBAR_OBJECT;
      typedef struct EFI_FOOBAR_OBJECT *EFI_FOOBAR_HANDLE;
    
    replacing the spec mandated
    
      typedef VOID *EFI_FOOBAR_HANDLE;
    
    (For some types, such as:
    
    - EFI_ACPI_HANDLE,
    - EFI_EVENT,
    - EFI_FONT_HANDLE,
    - EFI_HANDLE,
    - EFI_HII_HANDLE,
    - EFI_S3_BOOT_SCRIPT_POSITION,
    - SHELL_FILE_HANDLE,
    
    we connect the actual complete type (the internal, implementation-specific
    type) to the typedef. Some of these also demonstrate how the code could
    have looked in practice if the specs had used proper opaque (=incomplete)
    types.)
    
    Then, unleash "build" on the package DSC files. This causes the compiler
    to warn about incompatible pointer assignments, and to stop the build.
    
    The rest of the series addresses the resultant warnings. Each patch
    belongs in one of two categories:
    
    - semantic cleanups (no functional / behavioral changes),
    - actual bugfixes.
    
    As the subject line of this patch states, this specific patch is *not*
    meant to be applied. It is just a "what if" patch that temporarily
    isolates the standard types from each other, the way the specs should
    have, so that the compiler have more information to work with.
    
    Cc: Achin Gupta <achin.gupta@arm.com>
    Cc: Andrew Fish <afish@apple.com>
    Cc: Anthony Perard <anthony.perard@citrix.com>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Benjamin You <benjamin.you@intel.com>
    Cc: Chao Zhang <chao.b.zhang@intel.com>
    Cc: Dandan Bi <dandan.bi@intel.com>
    Cc: David Woodhouse <dwmw2@infradead.org>
    Cc: Eric Dong <eric.dong@intel.com>
    Cc: Guo Dong <guo.dong@intel.com>
    Cc: Hao A Wu <hao.a.wu@intel.com>
    Cc: Jaben Carsey <jaben.carsey@intel.com>
    Cc: Jian J Wang <jian.j.wang@intel.com>
    Cc: Jian Wang <jian.j.wang@intel.com>
    Cc: Jiaxin Wu <jiaxin.wu@intel.com>
    Cc: Jiewen Yao <jiewen.yao@intel.com>
    Cc: Jordan Justen <jordan.l.justen@intel.com>
    Cc: Julien Grall <julien.grall@arm.com>
    Cc: Leif Lindholm <leif.lindholm@linaro.org>
    Cc: Liming Gao <liming.gao@intel.com>
    Cc: Maurice Ma <maurice.ma@intel.com>
    Cc: Michael D Kinney <michael.d.kinney@intel.com>
    Cc: Ray Ni <ray.ni@intel.com>
    Cc: Siyuan Fu <siyuan.fu@intel.com>
    Cc: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
    Cc: Zhichao Gao <zhichao.gao@intel.com>
    Signed-off-by: Laszlo Ersek <lersek@redhat.com>
    
        
file modified
+4 -2