-
Notifications
You must be signed in to change notification settings - Fork 15.2k
Open
Labels
Description
In the file https://github.com/llvm/llvm-project/blob/main/llvm/lib/DebugInfo/LogicalView/LVReaderHandler.cpp
There is the "LVReaderHandler::handleArchive" method (around line 73) which is used to load debug informations from libraries.
The first statement create a local "Error" variable:
Error LVReaderHandler::handleArchive(LVReaders &Readers, StringRef Filename,
Archive &Arch) {
// HERE
Error Err = Error::success();
for (const Archive::Child &Child : Arch.children(Err)) {
Expected<MemoryBufferRef> BuffOrErr = Child.getMemoryBufferRef();
if (Error Err = BuffOrErr.takeError())
return createStringError(errorToErrorCode(std::move(Err)), "%s",
Filename.str().c_str());
Expected<StringRef> NameOrErr = Child.getName();
if (Error Err = NameOrErr.takeError())
return createStringError(errorToErrorCode(std::move(Err)), "%s",
Filename.str().c_str());
std::string Name = (Filename + "(" + NameOrErr.get() + ")").str();
if (Error Err = handleBuffer(Readers, Name, BuffOrErr.get()))
return createStringError(errorToErrorCode(std::move(Err)), "%s",
Filename.str().c_str());
}
return Error::success();
}
But this error is never checked or returned.
So the variable is always destroyed (without being moved) when it goes out of scope, which leads to an exception since the error checking is now mandatory before its deletion, even if tis a success.
I've tried a simple fix which seems to to the job, but I don't know if it's the best way to fix this issue:
Error LVReaderHandler::handleArchive(LVReaders &Readers, StringRef Filename,
Archive &Arch) {
Error Err = Error::success();
for (const Archive::Child &Child : Arch.children(Err)) {
Expected<MemoryBufferRef> BuffOrErr = Child.getMemoryBufferRef();
if (Error Err = BuffOrErr.takeError())
return createStringError(errorToErrorCode(std::move(Err)), "%s",
Filename.str().c_str());
Expected<StringRef> NameOrErr = Child.getName();
if (Error Err = NameOrErr.takeError())
return createStringError(errorToErrorCode(std::move(Err)), "%s",
Filename.str().c_str());
std::string Name = (Filename + "(" + NameOrErr.get() + ")").str();
if (Error Err = handleBuffer(Readers, Name, BuffOrErr.get()))
return createStringError(errorToErrorCode(std::move(Err)), "%s",
Filename.str().c_str());
}
// FIX HERE : the variable is always checked
if (Err)
{
return Error::success();
}
return Err;
}