On 03/20/2012 10:50 PM, Lubos Lunak wrote:
I've just found out that exception specification on functions in LO have been
just pretty comments, for about 10 years.
[...]
I found out by compiling LO with Clang, running it and having it crash where
gcc-compiler version had no problem. Stephan Bergmann and repo history
revealed that in 2001 -fno-enforce-eh-specs was added to gcc's flags, turning
off code generated that ensures these specifications are actually followed
(and MSVC has reportedly never cared). Clang does not have the option. I've
already actually fixed the problem (in
vbahelper/inc/vbahelper/vbaccesshelper.hxx) and it appears the specifications
somehow magically haven't rotten, as now LO runs fine for me (as far as I can
say, I can't test everything).
IIRC, Sun Studio enforced std::unexpected semantics until the last day
we actively used it, so effectively the code had only about a one-year
chance to rot after all.
I'm not strongly biased either way, but what we have right now are really
just pretty comments on functions. I think we should either say that we use
the specifications, in which case -fno-enforce-sh-specs should not be used at
least in debug builds, or we can say we follow the C++11/Boost/etc. trend and
not use them, in which case we can have one macro for portable way of saying
noexcept and have an EasyHack for removing the other specifications. BTW, it
should be also noted that SAL_THROW() expands to nothing with gcc.
I'm undecided about the state of C++ exceptions.
On the one hand, the design of C++ exceptions has severe limitations:
* Exceptions are not properly integrated with the type system. A
function type definition cannot have an exception specification.
Function templates cannot abstract over exception specifications.
* The old std::unexpected design easily pessimizes implementations of
functions with exception specifications. (The new noexcept design
mitigates that, at the cost of weakening the static information
available about a program, see below.)
Those limitations diminish the usefulness of exception specifications in
practice, hence the trend to ban them.
On the other hand, writing robust programs requires robust foundations.
It is my firm belief that we need more statically derivable knowledge
about programs, not less. For client code to interact with a function,
it is important to know as precise a specification of the function as
possible. What are its accepted inputs, how and with which values can
it return, what are its side effects. And the exceptions thrown by the
function make no exception here. If it shall be possible to
programmatically react to exceptions thrown by a function, it is
important to know what exceptions the function can throw and what the
program state will be in such a case. And it is advantageous for a
language to be able to enforce and verify as much static knowledge as
possible. After all, "well-typed programs can't go wrong." In that
light, the fundamental Java exception design IMO makes a lot of sense,
distinguishing between checked exceptions (that are supposed to be
handled programmatically) and unchecked ones (that act more like
asserts, or are intended to bring down the complete (sub-)system).
So if we follow the trend and ban old-style dynamic exception
specifications from our C++ code base, it would IMO be nice to
nevertheless have information about functions' exception behaviour
around, in a form suitable for mechanical verification. (For example by
disabling GCC's -fno-enforce-eh-specs for --enable-dbgutil builds.) But
maybe that's only a hopeless pipe dream of mine, anyway...
Stephan
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.