Please read the Coverity report attached in BZ 4204 for more details on sign-extension issue. The data types of logic_sector_size_hi and logic_sector_size_lo are UINT16 and Isn't the return type of *sizeof* already unsigned ? Now I have no means to run Coverity and test further changes. Anyway, my understanding back then was that the sign-extension was primarily happening because of the 16 bits left shift operation. I did test the patch for coverity warning resolution back in Jan'23 which went off. On Mon, Jun 5, 2023 at 4:28 AM Ard Biesheuvel wrote: > On Fri, 2 Jun 2023 at 21:42, Ranbir Singh wrote: > > > > From: Ranbir Singh > > > > Line number 1348 does contain a typecast with UINT32, but it is after > > all the operations (16-bit left shift followed by OR'ing) are over. > > To avoid any SIGN_EXTENSION, typecast the intermediate result after > > 16-bit left shift operation immediately with UINT32. > > > > What is wrong with sign extension? > > > Cc: Hao A Wu > > Cc: Ray Ni > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4204 > > Signed-off-by: Ranbir Singh > > --- > > MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c > b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c > > index 50406fe0270d..70c4ca27dc68 100644 > > --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c > > +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.c > > @@ -1345,7 +1345,7 @@ AtaPassThruPassThru ( > > // Check logical block size > > // > > if ((IdentifyData->AtaData.phy_logic_sector_support & BIT12) != 0) { > > - BlockSize = (UINT32)(((IdentifyData->AtaData.logic_sector_size_hi > << 16) | IdentifyData->AtaData.logic_sector_size_lo) * sizeof (UINT16)); > > + BlockSize = (((UINT32)(IdentifyData->AtaData.logic_sector_size_hi > << 16) | IdentifyData->AtaData.logic_sector_size_lo) * sizeof (UINT16)); > > > The outer parens are now redundant, which means you're assigning > something to BlockSize whose type is based on the type of > * sizeof(UINT16), which is unsigned long not unsigned int, so this > will produce a truncation warning on some compilers. > > If you want to suppress the coverity warning without introducing new > ones, better to cast the sizeof() to (UINT32). >