Date: prev next · Thread: first prev next last
2012 Archives by date, by thread · List index


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.