[llvm] r277776 - Clean up the logic of the Archive::Child::Child() with an assert to know Err is not a nullptr
Kevin Enderby via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 4 14:54:19 PDT 2016
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;
}
More information about the llvm-commits
mailing list