On 09/27/2011 09:00 PM, Stephan Bergmann wrote:
Hi all,

As has recently been discussed on #libreoffice-dev, its probably a good
idea to remove the rather unhelpful conversion operators

rtl::OString::operator sal_Char const * ()
rtl::OStringBuffer::operator sal_Char const * ()
rtl::OUString::operator sal_Unicode const * ()
rtl::OUStringBuffer::operator sal_Unicode const * ()

(The reason why this came up on IRC this time was that the expression
"aStr = aStr + cSep" with aStr of type rtl::OString and cSep of type
sal_Char had a rather non-intuitive meaning, implicitly converting aStr
into a sal_Char const *, adding the integral value of cSep to that
pointer, and then converting that modified sal_Char const * back into an
rtl::OString via the rtl::OString(sal_Char const *) constructor.)

The change will be source-code incompatible, but that is probably
acceptable:

- The change is ABI compatible (involving only inline C++ functions).

- The ~only legitimate use case for those conversion operators was in
indexing expressions like aStr[n]. To continue those expressions to
work, appropriate operator [](sal_Int) member functions will be added to
the four classes.

- All other uses of the conversion operators should use the getStr()
member functions. (Also note that there might be cases where translation
between, say, rtl::OString and char const * via naive application of
rtl::OString::getStr() is not appropriate as it potentially looses
information, when the given rtl::OString instance contains NUL
characters. Having the calls to getStr explicitly in the code helps
auditing in this case.)

My plan is as follows:

- I just pushed
<http://cgit.freedesktop.org/libreoffice/core/commit/?id=6671fa81db0ecea4ada005bb79f55f08fb440ad4>
"Removed uses of rtl::O[U]String[Buffer]::operator sal_{char|Unicode}
const *()." and
<http://cgit.freedesktop.org/libreoffice/binfilter/commit/?id=34c2ec87db4b6962ded661157056c58163e39821>
"Removed uses of rtl::O[U]String[Buffer]::operator sal_{char|Unicode}
const *()." That clears the current master of all dubious (i.e., non-[])
uses of the conversion operators for a Linux x86_64 --enable-binfilter
--enable-dbgutil "make check" build.

- A few more builds (e.g., Windows, Mac OS X) should be done with the
below patch to ensure that as many dubious uses in
platform-/configuration-switch-specific code as possible have been
fixed. If someone wants to give me a hand here, that would be great.

Decided to push <http://cgit.freedesktop.org/libreoffice/core/commit/?id=112bdf84d684590e042725c7173e059b4afa2f83> "Removed dangerous rtl::O[U]String[Buffer]::operator sal_{char,Unicode} const *." now, even though I didn't manage to get a Windows build yet (and it looks like that will still take a while...).

So, if you build on Windows and experience a breaker due to this commit, please be so kind and fix it (or discuss it here).

Thanks,
-Stephan
_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to