4.1.1 Type Checking
Some compilers perform stronger type checking than other compilers such as the
Intel family of compilers including the Intel(R) C Compiler for EFI Byte Code.
As a result, code that compiles without any errors or warnings on one compiler
may generate warnings or errors when compiled with another compiler. The
following example shows two common examples from UEFI Drivers that use
AllocatePool()
and OpenProtocol()
.
These examples show the style that may generate warnings with some compilers, and the correct method to prevent the warnings.
Example 7-Stronger type checking
#include <Uefi.h>
#include <Protocol/BlockIo.h>
#include <Protocol/DriverBinding.h>
#include <Library/UefiBootServicesTableLib.h>
typedef struct {
UINT8 First;
UINT32 Second;
} MY_STRUCTURE;
EFI_STATUS Status;
EFI_DRIVER_BINDING_PROTOCOL *This;
EFI_HANDLE ControllerHandle;
EFI_BLOCK_IO_PROTOCOL *BlockIo;
MY_STRUCTURE *MyStructure;
Status = gBS->OpenProtocol (
ControllerHandle,
&gEfiBlockIoProtocolGuid,
&BlockIo, // Compiler warning
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
Status = gBS->OpenProtocol (
ControllerHandle,
&gEfiBlockIoProtocolGuid,
(VOID **)&BlockIo, // No compiler warning
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
Status = gBS->AllocatePool (
EfiBootServicesData,
sizeof (MY_STRUCTURE),
&MyStructure // Compiler warning
);
Status = gBS->AllocatePool (
EfiBootServicesData,
sizeof (MY_STRUCTURE),
(VOID **)&MyStructure // No compiler warning
);