Laszlo,
Thank you for the sharing. Your patches really help to improve the EDKII code 
quality.

Regards,
Ray

>-----Original Message-----
>From: Laszlo Ersek [mailto:[email protected]]
>Sent: Wednesday, June 29, 2016 7:50 PM
>To: Ni, Ruiyu <[email protected]>; edk2-devel-01 <[email protected]>
>Cc: Carsey, Jaben <[email protected]>; Qiu, Shumin <[email protected]>
>Subject: Re: [edk2] [PATCH 4/6] ShellPkg: don't call functions with side 
>effects in ASSERT_EFI_ERROR()
>
>On 06/29/16 08:36, Ni, Ruiyu wrote:
>> Laszlo,
>> Thanks for fixing such a big bug.
>>
>> I am curious how you detect such buggy code? By code review?
>
>Yes.
>
>I described this in the 0/6 message
><http://thread.gmane.org/gmane.comp.bios.edk2.devel/13736>, but I'm
>happy to elaborate. :)
>
>So, Gerd has a Jenkins Continuous Integration environment that regularly
>fetches new edk2 commits and build OvmfPkg and ArmVirtPkg platforms.
>Gerd has recently updated his Jenkins instance to gcc-6, and gcc-6 flags
>some C language constructs -- with new warnings -- that used to "stay
>under the radar" with earlier gcc releases.
>
>So, one of the erroneous constructs that gcc-6 finds is:
>
>  ASSERT_EFI_ERROR (BooleanExpression)
>
>Clearly, in this case the programmer meant
>
>  ASSERT (BooleanExpression)
>
>and ASSERT_EFI_ERROR() is just a typo.
>
>gcc-6 finds this issue because:
>- ASSERT_EFI_ERROR() expands to EFI_ERROR(),
>- EFI_ERROR() expands to RETURN_ERROR(),
>- and RETURN_ERROR() checks if the argument, first converted to
>  RETURN_STATUS (== UINTN), then converted to INTN, is negative,
>- when a boolean expression is converted to UINTN, then INTN, the
>  result is always 0 or 1 -- it can never be negative.
>
>Therefore the incorrect form
>
>  ASSERT_EFI_ERROR (BooleanExpression)
>
>never fires, and gcc-6 finds it with the "-Wbool-compare".
>
>Now, Gerd's build stopped with the first such error, and because I
>hadn't set up gcc-6 yet, I decided to audit all ASSERT_EFI_ERROR()
>applications in edk2. I used the following command as first step:
>
>  git grep -Enw ASSERT_EFI_ERROR \
>  | grep -E -v 'ASSERT_EFI_ERROR( )?\(Status\)'
>
>because I wanted to see all invocations of this macro, *except* the
>following two form:
>
>  ASSERT_EFI_ERROR(Status)
>  ASSERT_EFI_ERROR (Status)
>
>Those two are by far the most frequent ones, and I trusted that a
>variable called "Status" would always have type RETURN_STATUS or EFI_STATUS.
>
>The rest of the macro invocations I audited one by one. Most of the
>errors that I found were of the kind
>
>  ASSERT_EFI_ERROR (BooleanExpression)
>
>which I simply fixed by removing the "_EFI_ERROR" part.
>
>The code fixed by this patch had a different kind of error, but the way
>I found those locations was the same: just looking at ASSERT_EFI_ERROR
>macro invocations.
>
>Thanks!
>Laszlo
>
>>> -----Original Message-----
>>> From: edk2-devel [mailto:[email protected]] On Behalf Of 
>>> Laszlo Ersek
>>> Sent: Tuesday, June 28, 2016 9:26 PM
>>> To: edk2-devel-01 <[email protected]>
>>> Cc: Carsey, Jaben <[email protected]>; Qiu, Shumin 
>>> <[email protected]>
>>> Subject: [edk2] [PATCH 4/6] ShellPkg: don't call functions with side 
>>> effects in ASSERT_EFI_ERROR()
>>>
>>> When ASSERT_EFI_ERROR() is compiled out, dependent on build flags, only
>>> the status checking should be removed; the function calls should stay.
>>>
>>> Cc: Jaben Carsey <[email protected]>
>>> Cc: Shumin Qiu <[email protected]>
>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>> Signed-off-by: Laszlo Ersek <[email protected]>
>>> ---
>>>
>>> Notes:
>>>    build tested
>>>
>>> ShellPkg/Library/UefiShellLevel1CommandsLib/If.c | 10 ++++++++--
>>> ShellPkg/Library/UefiShellLib/UefiShellLib.c     |  5 ++++-
>>> 2 files changed, 12 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/ShellPkg/Library/UefiShellLevel1CommandsLib/If.c 
>>> b/ShellPkg/Library/UefiShellLevel1CommandsLib/If.c
>>> index 7abfd8944b92..dc96bffde7d3 100644
>>> --- a/ShellPkg/Library/UefiShellLevel1CommandsLib/If.c
>>> +++ b/ShellPkg/Library/UefiShellLevel1CommandsLib/If.c
>>> @@ -991,8 +991,11 @@ ShellCommandRunElse (
>>>   IN EFI_SYSTEM_TABLE  *SystemTable
>>>   )
>>> {
>>> +  EFI_STATUS  Status;
>>>   SCRIPT_FILE *CurrentScriptFile;
>>> -  ASSERT_EFI_ERROR(CommandInit());
>>> +
>>> +  Status = CommandInit ();
>>> +  ASSERT_EFI_ERROR (Status);
>>>
>>>   if (gEfiShellParametersProtocol->Argc > 1) {
>>>     ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), 
>>> gShellLevel1HiiHandle, L"if");
>>> @@ -1066,8 +1069,11 @@ ShellCommandRunEndIf (
>>>   IN EFI_SYSTEM_TABLE  *SystemTable
>>>   )
>>> {
>>> +  EFI_STATUS  Status;
>>>   SCRIPT_FILE *CurrentScriptFile;
>>> -  ASSERT_EFI_ERROR(CommandInit());
>>> +
>>> +  Status = CommandInit ();
>>> +  ASSERT_EFI_ERROR (Status);
>>>
>>>   if (gEfiShellParametersProtocol->Argc > 1) {
>>>     ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), 
>>> gShellLevel1HiiHandle, L"if");
>>> diff --git a/ShellPkg/Library/UefiShellLib/UefiShellLib.c 
>>> b/ShellPkg/Library/UefiShellLib/UefiShellLib.c
>>> index cf89a4ac87ed..35a1a7169c8b 100644
>>> --- a/ShellPkg/Library/UefiShellLib/UefiShellLib.c
>>> +++ b/ShellPkg/Library/UefiShellLib/UefiShellLib.c
>>> @@ -373,6 +373,8 @@ EFIAPI
>>> ShellInitialize (
>>>   )
>>> {
>>> +  EFI_STATUS Status;
>>> +
>>>   //
>>>   // if auto initialize is not false then skip
>>>   //
>>> @@ -383,7 +385,8 @@ ShellInitialize (
>>>   //
>>>   // deinit the current stuff
>>>   //
>>> -  ASSERT_EFI_ERROR(ShellLibDestructor(gImageHandle, gST));
>>> +  Status = ShellLibDestructor (gImageHandle, gST);
>>> +  ASSERT_EFI_ERROR (Status);
>>>
>>>   //
>>>   // init the new stuff
>>> --
>>> 1.8.3.1
>>>
>>>
>>> _______________________________________________
>>> edk2-devel mailing list
>>> [email protected]
>>> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to