[Development] QtCore missing check for memory allocation
Thiago Macieira
thiago.macieira at intel.com
Fri Feb 27 01:12:27 CET 2015
On Thursday 26 February 2015 20:54:32 Oswald Buddenhagen wrote:
> > Let me put it this way: who's going to write the unit tests to ensure we
> > get coverage for all those conditionals? Any volunteers?
>
> which conditionals? the malloc wrapper would throw/qFatal (depending on
> the build configuration). your dream of never-failing malloc would be a
> reality.
> or we "just" use new() everywhere. this one already has said wrapper.
The conditionals for checking the result of malloc or new (nothrow). If no one
is testing, how can we check that we caught all places?
> regarding replacing the malloc implementation ... is it possible to link
> an implementation that would actually throw?
No, malloc() cannot ever throw. If you throw and your caller is C code, you
crash. Also, malloc() is defined as nothrow() in the glibc headers.
The best it could do is raise(SIGABRT) or somesuch.
> > Sorry, the compiler *is* allowed to remove undefined behaviour because, by
> > the very definition of undefined behaviour, ANYTHING can happen,
> > including absolutely nothing.
>
> then explain edd2d9bd0a7f5dbe059aea0902d519b728acc01a.
Who says that's good code? I fixed a warning, I didn't make the code good.
If the compiler starts removing the undefined behaviour, we'll get a test
failure and we can easily correct it. We can't do that in a library because we
don't know when it will fail.
> > > > > [...] Q_CHECK_PTR should mean "If the pointer is 0 either throw
> > > > > an exception or abort right away. Don't just continue."
> > > >
> > > > I understand your arguments, but I still disagree we should act.
> > >
> > > well, and i say you are wrong. see the problem with this kind of
> > > argumentation?
> >
> > We've both exposed our technical argumentation for our suggestions but
> > arrived at no consensus.
>
> you missed the point. you didn't provide arguments, only an opinion (at
The argument is that it implies runtime overhead. See Robin's email for
numbers. This is asking for making the code slower on the very devices where
it needs to run faster.
The argument is that we're in the habit of not checking it, so even if we had
a massive effort to fix all the cases, we'll soon add more that we don't check.
The argument is that we have no infrastructure for testing OOM situations to
guarantee that we reliably take the action we decided. And no one is
volunteering to write the tests. Just sprinkling Q_CHECK_PTR all over the
place is no good if we miss critical ones.
The argument is that this is a massive change. Most of our modules (except for
QtCore, QtConcurrent, QtXmlPatterns) are compiled with exceptions disabled and
yet we use the regular, non-nothrow operator new, so we'd need to replace it
EVERYWHERE with the nothrow version plus the check.
The argument is that we use libraries that don't care either for OOM
situations. So even if we made the effort ourselves, it might be all for
nothing as soon as we make a call to one of those libraries (think glib &
friends).
The argument is that even if we happened to catch all failures to malloc() in
all libraries, there's also all those pesky system calls that may return
ENOMEM and we're not checking those. So wrapping malloc() and operator new are
not enough: we need to check system calls too. And extend that to all the
calls to libraries that do catch malloc() and system call failures and report
errors to us.
The argument is that chain is as strong as its weakest link. If we don't fix
all the holes, the bucket will still leak (pardon my switch of metaphors).
The argument is that, even with all of this, there's no way to reliably catch
an OOM situation, due to overcommit. The application may suddenly disappear.
And the conclusion, which is not technical but subjective, based on the
complexity of the problem as stated above that this is a waste of our time
when we have more important things to do. We've had this discussion before and
we're now spending time discussing it again. And if we were to accept it, we'd
spend a lot of development time that could be better directed elsewhere.
> the point of the discussion this quote refers to). it isn't constructive
> to state your position without backing it up. if you stand by your
> previously made arguments, post links, or refer to a search engine
> (possibly suggesting keywords). not everyone witnessed the previous
> discussions, or remembers them.
And even if I had no technical arguments, my opinion counts. I'm not pulling
this out of thin air. I have over a decade of experience, so if I say that it
sounds wrong, it probably is. And I'm the maintainer for QtCore, so I'm the
one that needs to be convinced, not the other way around.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
More information about the Development
mailing list