[llvm] r277776 - Clean up the logic of the Archive::Child::Child() with an assert to know Err is not a nullptr

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 8 09:40:48 PDT 2016


Looks great!

On Thu, Aug 4, 2016 at 3:02 PM Kevin Enderby via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: enderby
> Date: Thu Aug  4 16:54:19 2016
> New Revision: 277776
>
> URL: http://llvm.org/viewvc/llvm-project?rev=277776&view=rev
> Log:
> Clean up the logic of the Archive::Child::Child() with an assert to know
> Err is not a nullptr
> when we are pointed at real data.
>
> David Blaikie pointed out some odd logic in the case the Err value was a
> nullptr and
> Lang Hames suggested it could be cleaned it up with an assert to know that
> Err is
> not a nullptr when we are pointed at real data.  As only in the case of
> constructing
> the sentinel value by pointing it at null data is Err is permitted to be a
> nullptr,
> since no error could occur in that case.
>
> With this change the testing for “if (Err)” is removed from the
> constructor’s logic
> and *Err is used directly without any check after the assert().
>
> Modified:
>     llvm/trunk/lib/Object/Archive.cpp
>
> Modified: llvm/trunk/lib/Object/Archive.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Archive.cpp?rev=277776&r1=277775&r2=277776&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Object/Archive.cpp (original)
> +++ llvm/trunk/lib/Object/Archive.cpp Thu Aug  4 16:54:19 2016
> @@ -310,27 +310,32 @@ Archive::Child::Child(const Archive *Par
>                               (Start - Parent->getData().data()), Err) {
>    if (!Start)
>      return;
> +
> +  // If we are pointed to real data, Start is not a nullptr, then there
> must be
> +  // a non-null Err pointer available to report malformed data on.  Only
> in
> +  // the case sentinel value is being constructed is Err is permitted to
> be a
> +  // nullptr.
> +  assert(Err && "Err can't be nullptr if Start is not a nullptr");
> +
>    ErrorAsOutParameter ErrAsOutParam(Err);
>
> -  // If there was an error in the construction of the Header and we were
> passed
> -  // Err that is not nullptr then just return with the error now set.
> -  if (Err && *Err)
> +  // If there was an error in the construction of the Header
> +  // then just return with the error now set.
> +  if (*Err)
>      return;
>
>    uint64_t Size = Header.getSizeOf();
>    Data = StringRef(Start, Size);
>    Expected<bool> isThinOrErr = isThinMember();
>    if (!isThinOrErr) {
> -    if (Err)
> -      *Err = isThinOrErr.takeError();
> +    *Err = isThinOrErr.takeError();
>      return;
>    }
>    bool isThin = isThinOrErr.get();
>    if (!isThin) {
>      Expected<uint64_t> MemberSize = getRawSize();
>      if (!MemberSize) {
> -      if (Err)
> -        *Err = MemberSize.takeError();
> +      *Err = MemberSize.takeError();
>        return;
>      }
>      Size += MemberSize.get();
> @@ -342,26 +347,23 @@ Archive::Child::Child(const Archive *Par
>    // Don't include attached name.
>    Expected<StringRef> NameOrErr = getRawName();
>    if (!NameOrErr){
> -    if (Err)
> -      *Err = NameOrErr.takeError();
> +    *Err = NameOrErr.takeError();
>      return;
>    }
>    StringRef Name = NameOrErr.get();
>    if (Name.startswith("#1/")) {
>      uint64_t NameSize;
>      if (Name.substr(3).rtrim(' ').getAsInteger(10, NameSize)) {
> -      if (Err) {
> -        std::string Buf;
> -        raw_string_ostream OS(Buf);
> -        OS.write_escaped(Name.substr(3).rtrim(' '));
> -        OS.flush();
> -        uint64_t Offset = Start - Parent->getData().data();
> -        *Err = malformedError("long name length characters after the #1/
> are "
> -                              "not all decimal numbers: '" + Buf + "' for
> "
> -                              "archive member header at offset " +
> -                              Twine(Offset));
> -        return;
> -      }
> +      std::string Buf;
> +      raw_string_ostream OS(Buf);
> +      OS.write_escaped(Name.substr(3).rtrim(' '));
> +      OS.flush();
> +      uint64_t Offset = Start - Parent->getData().data();
> +      *Err = malformedError("long name length characters after the #1/
> are "
> +                            "not all decimal numbers: '" + Buf + "' for "
> +                            "archive member header at offset " +
> +                            Twine(Offset));
> +      return;
>      }
>      StartOfFile += NameSize;
>    }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160808/7b418f2d/attachment.html>


More information about the llvm-commits mailing list