> On Feb 14, 2020, at 2:50 PM, Michael D Kinney <michael.d.kin...@intel.com> 
> wrote:
> 
> Hi Vitaly,
>
> I agree that this proposal makes a lot of sense.  We recently added a new 
> assert type called STATIC_ASSERT() for assert conditions that can be tested 
> at build time.
>
> A new assert type for checks that can be removed and the API still guarantees 
> that it fails gracefully with a proper return code is a good idea.  Given we 
> have STATIC_ASSERT(), how about naming the new macro CONSTRAINT_ASSERT()?
>
> We also want the default to be enabled.  The current use of bit 0x40 in 
> PcdDebugPropertyMask  is always clear, so we want the asserts enabled when 
> 0x40 is clear.  We can change the name of the define bit to 
> DEBUG_PROPERTY_CONTRAINT_ASSERT_DISABLED so bit 0x40 needs to be set in 
> PcdDebugPropertyMask to disable these types of asserts.
>
> This approach does require all the DebugLib implementations to be updated 
> with the new DebugConstraintAssertDisabled() API.
>

Mike,

If you wanted to be backward compatible you could just use DebugAssertEnabled 
() but in place of _ASSERT() use _CONSTRAINT_ASSERT

#define _ASSERT(Expression)  DebugAssert (__FILE__, __LINE__, #Expression)

#define _CONSTRAINT_ASSERT(Expression)  DebugPrint (DEBUG_ERROR,  "ASSERT 
%a(%d): %a\n",, __FILE__, __LINE__, #Expression)

Not as elegant as the non backward compatible change, but I thought I'd throw 
it out there. 

There are some ancient Apple C ASSERT macros [AssertMacros.h]  that also have 
the concept of require. Require includes an exception label (goto label). It is 
like a CONSTRAINT_ASSERT() but with the label. On release builds the DEBUG 
prints are skipped. 

So we could do something like:

  EFI_STATUS Status =  EFI_INVALID_PARAMETER;

  REQUIRE(Arg1 != NULL, ErrorExit);
  REQUIRE(Arg2 != NULL, ErrorExit);
  REQUIRE(Arg3 != NULL, ErrorExit);

ErrorExit:
  return Status;

There is another form that allows an ACTION (a statement to execute. So you 
could have:

  EFI_STATUS Status;

  REQUIRE_ACTION(Arg1 != NULL, ErrorExit, Status = EFI_INVALID_PARAMETER);
  REQUIRE_ACTION(Arg2 != NULL, ErrorExit, Status = EFI_INVALID_PARAMETER);
  REQUIRE_ACTION(Arg3 != NULL, ErrorExit, Status = EFI_INVALID_PARAMETER);

ErrorExit:
  return Status;

If you use CONSTRAINT_ASSERT();

  if (Arg1 == NULL || Arg2 == NULL || Arg3 == NULL) {
   CONSTRAINT_ASSERT (Arg1 != NULL);
   CONSTRAINT_ASSERT (Arg2 != NULL);
   CONSTRAINT_ASSERT (Arg3 != NULL);
   return EFI_INVALID_PARAMETER;
 }

I'd note error processing args on entry is the simplest case.  In a more 
complex case when cleanup is required the goto label is more useful. 

I guess we could argue for less typing and more symmetry and say use ASSERT, 
CONSTRAINT, and REQUIRE. I guess you could add an ASSERT_ACTION too. 

The AssertMacros.h versions also support _quiet (skip the print) and _string 
(add a string to the print) so you end up with:
REQUIRE
REQUIRE_STRING
REQUIRE_QUIET
REQUIRE_ACTION
REQUIRE_ACTION_STRING
REQUIRE_ACTION_QUIET

We could also end up with 
CONSTRAINT
CONSTRAINT_STRING
CONSTRAINT_QUIET

I think the main idea behind _QUIET is you can silence things that are too 
noisy, and you can easily make noise things show up by removing the _QUIET to 
debug. 

I'd thought I throw out the other forms for folks to think about. I'm probably 
biased as I used to looking at code and seeing things like 
require_action_string(Arg1 != NULL, ErrorExit, Status = EFI_INVALID_PARAMETER, 
"1st Arg1 check");

Thanks,

Andrew Fish

PS The old debug macros had 2 versions of CONSTRAINT check and verify. The 
check version was compiled out on a release build, the verify version always 
does the check and just skips the DEBUG print. 

> Mike
>
>
>
> From: vit9696 <vit9...@protonmail.com <mailto:vit9...@protonmail.com>> 
> Sent: Friday, February 14, 2020 9:38 AM
> To: Kinney, Michael D <michael.d.kin...@intel.com 
> <mailto:michael.d.kin...@intel.com>>
> Cc: devel@edk2.groups.io <mailto:devel@edk2.groups.io>; Gao, Liming 
> <liming....@intel.com <mailto:liming....@intel.com>>; Gao, Zhichao 
> <zhichao....@intel.com <mailto:zhichao....@intel.com>>; Marvin Häuser 
> <marvin.haeu...@outlook.com <mailto:marvin.haeu...@outlook.com>>; Laszlo 
> Ersek <ler...@redhat.com <mailto:ler...@redhat.com>>
> Subject: Re: [edk2-devel] [PATCH v3 0/1] Add PCD to disable safe string 
> constraint assertions
>
> Michael,
>
> Generalising the approach makes good sense to me, but we need to make an 
> obvious distinguishable difference between:
> - precondition and invariant assertions (i.e. assertions, where function will 
> NOT work if they are violated)
> - constraint asserts (i.e. assertions, which allow us to spot unintentional 
> behaviour when parsing untrusted data, but which do not break function 
> behaviour).
>
> As we want to use this outside of SafeString,  I suggest the following:
> - Introduce DEBUG_PROPERTY_ASSERT_CONSTRAINT_ENABLED 0x40 bit for 
> PcdDebugPropertyMask instead of PcdAssertOnSafeStringConstraints.
> - Introduce DebugAssertConstraintEnabled DebugLib function to check for 
> DEBUG_PROPERTY_ASSERT_CONSTRAINT_ENABLED.
> - Introduce ASSERT_CONSTRAINT macro, that will assert only if 
> DebugConstraintAssertEnabled returns true.
> - Change SafeString ASSERTS in SAFE_STRING_CONSTRAINT_CHECK to 
> ASSERT_CONSTRAINTs.
> - Use ASSERT_CONSTRAINT in other places where necessary.
> 
> 
> I believe this way lines best with EDK II design. If there are no objections, 
> I can submit the patch in the beginning of next week.
> 
> 
> Best wishes,
> Vitaly
> 
> 
> 14 февр. 2020 г., в 20:00, Kinney, Michael D <michael.d.kin...@intel.com 
> <mailto:michael.d.kin...@intel.com>> написал(а):
>
> Vitaly,
>
> I want to make sure a feature PCD can be used to disable ASSERT() behavior in 
> more than just safe string functions in BaseLib.
>
> Can we consider changing the name and description of 
> PcdAssertOnSafeStringConstraints to be more generic, so if we find other lib 
> APIs, the name will make sense?
>
> Maybe something like: PcdEnableLibraryAssertChecks?  Default is TRUE.  Can 
> set to FALSE in DSC file to disable ASSERT() checks.
>
> Thanks,
>
> Mike
>
>
>
> From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> 
> <devel@edk2.groups.io <mailto:devel@edk2.groups.io>> On Behalf Of Vitaly 
> Cheptsov via Groups.Io
> Sent: Friday, February 14, 2020 3:55 AM
> To: Kinney, Michael D <michael.d.kin...@intel.com 
> <mailto:michael.d.kin...@intel.com>>; Gao, Liming <liming....@intel.com 
> <mailto:liming....@intel.com>>; Gao, Zhichao <zhichao....@intel.com 
> <mailto:zhichao....@intel.com>>; devel@edk2.groups.io 
> <mailto:devel@edk2.groups.io>
> Cc: Marvin Häuser <marvin.haeu...@outlook.com 
> <mailto:marvin.haeu...@outlook.com>>; Laszlo Ersek <ler...@redhat.com 
> <mailto:ler...@redhat.com>>
> Subject: Re: [edk2-devel] [PATCH v3 0/1] Add PCD to disable safe string 
> constraint assertions
>
> Replying as per Liming's request for this to be merged into edk2-stable202002.
>
> On Mon, Feb 10, 2020 at 14:12, vit9696 <vit9...@protonmail.com 
> <mailto:vit9...@protonmail.com>> wrote:
> Hello,
> 
> It has been quite some time since we submitted the patch with so far no 
> negative response. As I mentioned previously, my team will strongly benefit 
> from its landing in EDK II mainline. Since it does not add any regressions 
> and can be viewed as a feature implementation for the rest of EDK II users, I 
> request this to be merged upstream in edk2-stable202002.
> 
> Best wishes,
> Vitaly
> 
> > 27 янв. 2020 г., в 12:47, vit9696 <vit9...@protonmail.com 
> > <mailto:vit9...@protonmail.com>> написал(а):
> > 
> > 
> > Hi Mike,
> > 
> > Any progress with this? We would really benefit from this landing in the 
> > next stable release.
> > 
> > Best,
> > Vitaly
> > 
> >> 8 янв. 2020 г., в 19:35, Kinney, Michael D <michael.d.kin...@intel.com 
> >> <mailto:michael.d.kin...@intel.com>> написал(а):
> >> 
> >> 
> >> Hi Vitaly,
> >> 
> >> Thanks for the additional background. I would like
> >> a couple extra day to review the PCD name and the places
> >> the PCD might potentially be used.
> >> 
> >> If we find other APIs where ASSERT() behavior is only
> >> valuable during dev/debug to quickly identify misuse
> >> with trusted data and the API provides predicable
> >> return behavior when ASSERT() is disabled, then I would
> >> like to have a pattern we can potentially apply to all
> >> these APIs across all packages.
> >> 
> >> Thanks,
> >> 
> >> Mike
> >> 
> >>> -----Original Message-----
> >>> From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> 
> >>> <devel@edk2.groups.io <mailto:devel@edk2.groups.io>> On
> >>> Behalf Of Vitaly Cheptsov via Groups.Io
> >>> Sent: Monday, January 6, 2020 10:44 AM
> >>> To: Kinney, Michael D <michael.d.kin...@intel.com 
> >>> <mailto:michael.d.kin...@intel.com>>
> >>> Cc: devel@edk2.groups.io <mailto:devel@edk2.groups.io>
> >>> Subject: Re: [edk2-devel] [PATCH v3 0/1] Add PCD to
> >>> disable safe string constraint assertions
> >>> 
> >>> Hi Mike,
> >>> 
> >>> Yes, the primary use case is for UEFI Applications. We
> >>> do not want to disable ASSERT’s completely, as
> >>> assertions that make sense, i.e. the ones signalising
> >>> about interface misuse, are helpful for debugging.
> >>> 
> >>> I have already explained in the BZ that basically all
> >>> safe string constraint assertions make no sense for
> >>> handling untrusted data. We find this use case very
> >>> logical, as these functions behave properly with
> >>> assertions disabled and cover all these error
> >>> conditions by the return statuses. In such situation is
> >>> not useful for these functions to assert, as we end up
> >>> inefficiently reimplementing the logic. I would have
> >>> liked the approach of discussing the interfaces
> >>> individually, but I struggle to find any that makes
> >>> sense from this point of view.
> >>> 
> >>> AsciiStrToGuid will ASSERT when the length of the
> >>> passed string is odd. Functions that cannot, ahem,
> >>> parse, for us are pretty much useless.
> >>> AsciiStrCatS will ASSERT when the appended string does
> >>> not fit the buffer. For us this logic makes this
> >>> function pretty much equivalent to deprecated and thus
> >>> unavailable AsciiStrCat, except it is also slower.
> >>> 
> >>> My original suggestion was to remove the assertions
> >>> entirely, but several people here said that they use
> >>> them to verify usage errors when handling trusted data.
> >>> This makes good sense to me, so we suggest to support
> >>> both cases by introducing a PCD in this patch.
> >>> 
> >>> Best wishes,
> >>> Vitaly
> >>> 
> >>>> 6 янв. 2020 г., в 21:28, Kinney, Michael D
> >>> <michael.d.kin...@intel.com <mailto:michael.d.kin...@intel.com>> 
> >>> написал(а):
> >>>> 
> >>>> 
> >>>> Hi Vitaly,
> >>>> 
> >>>> Is the use case for UEFI Applications?
> >>>> 
> >>>> There is a different mechanism to disable all
> >>> ASSERT()
> >>>> statements within a UEFI Application.
> >>>> 
> >>>> If a component is consuming data from an untrusted
> >>> source,
> >>>> then that component is required to verify the
> >>> untrusted
> >>>> data before passing it to a function that clearly
> >>> documents
> >>>> is input requirements. If this approach is followed,
> >>> then
> >>>> the BaseLib functions can be used "as is" as long as
> >>> the
> >>>> ASSERT() conditions are verified before calling.
> >>>> 
> >>>> If there are some APIs that currently document their
> >>> ASSERT()
> >>>> behavior and we think that ASSERT() behavior is
> >>> incorrect and
> >>>> should be handled by an existing error return value,
> >>> then we
> >>>> should discuss each of those APIs individually.
> >>>> 
> >>>> Mike
> >>>> 
> >>>> 
> >>>>> -----Original Message-----
> >>>>> From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> 
> >>>>> <devel@edk2.groups.io <mailto:devel@edk2.groups.io>> On
> >>>>> Behalf Of Vitaly Cheptsov via Groups.Io
> >>>>> Sent: Friday, January 3, 2020 9:13 AM
> >>>>> To: devel@edk2.groups.io <mailto:devel@edk2.groups.io>
> >>>>> Subject: [edk2-devel] [PATCH v3 0/1] Add PCD to
> >>> disable
> >>>>> safe string constraint assertions
> >>>>> 
> >>>>> REF:
> >>>>> https://bugzilla.tianocore.org/show_bug.cgi?id=2054 
> >>>>> <https://bugzilla.tianocore.org/show_bug.cgi?id=2054>
> >>>>> 
> >>>>> Requesting for merge in edk2-stable202002.
> >>>>> 
> >>>>> Changes since V1:
> >>>>> - Enable assertions by default to preserve the
> >>> original
> >>>>> behaviour
> >>>>> - Fix bugzilla reference link
> >>>>> - Update documentation in BaseLib.h
> >>>>> 
> >>>>> Vitaly Cheptsov (1):
> >>>>> MdePkg: Add PCD to disable safe string constraint
> >>>>> assertions
> >>>>> 
> >>>>> MdePkg/MdePkg.dec | 6 ++
> >>>>> MdePkg/Library/BaseLib/BaseLib.inf | 11 +--
> >>>>> MdePkg/Include/Library/BaseLib.h | 74
> >>>>> +++++++++++++-------
> >>>>> MdePkg/Library/BaseLib/SafeString.c | 4 +-
> >>>>> MdePkg/MdePkg.uni | 6 ++
> >>>>> 5 files changed, 71 insertions(+), 30 deletions(-)
> >>>>> 
> >>>>> --
> >>>>> 2.21.0 (Apple Git-122.2)
> >>>>> 
> >>>>> 
> >>>>> -=-=-=-=-=-=
> >>>>> Groups.io <http://groups.io/> Links: You receive all messages sent to
> >>> this
> >>>>> group.
> >>>>> 
> >>>>> View/Reply Online (#52837):
> >>>>> https://edk2.groups.io/g/devel/message/52837 
> >>>>> <https://edk2.groups.io/g/devel/message/52837>
> >>>>> Mute This Topic:
> >>> https://groups.io/mt/69401948/1643496 
> >>> <https://groups.io/mt/69401948/1643496>
> >>>>> Group Owner: devel+ow...@edk2.groups.io 
> >>>>> <mailto:devel+ow...@edk2.groups.io>
> >>>>> Unsubscribe: https://edk2.groups.io/g/devel/unsub 
> >>>>> <https://edk2.groups.io/g/devel/unsub>
> >>>>> [michael.d.kin...@intel.com <mailto:michael.d.kin...@intel.com>]
> >>>>> -=-=-=-=-=-=
> >>>> 
> >>> 
> >>> 
> >>> 
> >> 
> > 
> 
>
>
>
> 


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

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

Reply via email to