diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2023-06-01 15:13:06 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2023-06-02 08:16:37 +0200 |
commit | 705768837912d38612ab2b06dba1ca491782b773 (patch) | |
tree | 371a6e31ad1fd857a06a85d1d346df9dce8988b3 /vcl/source/control | |
parent | 14b3ad0b4e5a540f436db3467f8a4051392f8479 (diff) |
Cannot self-append OUStringBuffer via concatenation
a5084d15e1b72e303e1628fbff84432036b014a9 "loplugin:stringadd in vcl" had dropped
the intermediary sTemp, but which caused JunitTest_forms_unoapi_1 to fail for me
once with
> ==2657124==ERROR: AddressSanitizer: memcpy-param-overlap: memory ranges [0x50c00086ca58,0x50c00086ca6a) and [0x50c00086ca48, 0x50c00086ca5a) overlap
> #0 in __asan_memcpy at ~/github.com/llvm/llvm-project/compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp:22:3
> #1 in char16_t* rtl::addDataHelper<char16_t>(char16_t*, char16_t const*, unsigned long) at include/rtl/stringconcat.hxx:80:9
> #2 in rtl::ToStringHelper<rtl::OUStringBuffer>::operator()(char16_t*, rtl::OUStringBuffer const&) const at include/rtl/ustrbuf.hxx:1765:14
> #3 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>::addData(char16_t*) const at include/rtl/stringconcat.hxx:195:64
> #4 in rtl::ToStringHelper<rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>>::operator()(char16_t*, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0> const&) const at include/rtl/stringconcat.hxx:207:101
> #5 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>::addData(char16_t*) const at include/rtl/stringconcat.hxx:195:88
> #6 in rtl::ToStringHelper<rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>>::operator()(char16_t*, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0> const&) const at include/rtl/stringconcat.hxx:207:101
> #7 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>::addData(char16_t*) const at include/rtl/stringconcat.hxx:195:88
> #8 in rtl::ToStringHelper<rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>>::operator()(char16_t*, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0> const&) const at include/rtl/stringconcat.hxx:207:101
> #9 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const [4], 0>::addData(char16_t*) const at include/rtl/stringconcat.hxx:195:88
> #10 in rtl::ToStringHelper<rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const [4], 0>>::operator()(char16_t*, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const [4], 0> const&) const at include/rtl/stringconcat.hxx:207:101
> #11 in rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const [4], 0>, rtl::OUStringBuffer, 0>::addData(char16_t*) const at include/rtl/stringconcat.hxx:195:88
> #12 in rtl::OUStringBuffer& rtl::OUStringBuffer::operator=<rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const [4], 0>, rtl::OUStringBuffer>(rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, rtl::StringConcat<char16_t, char const [3], rtl::OUString, 0>, char const [3], 0>, rtl::OUStringBuffer, 0>, char const [4], 0>, rtl::OUString, 0>, char const [4], 0>, rtl::OUStringBuffer, 0>&&) at include/rtl/ustrbuf.hxx:378:17
> #13 in DoubleCurrencyField::UpdateCurrencyFormat() at vcl/source/control/fmtfield.cxx:1120:20
and e.g.
> OUStringBuffer b("a");
> b = "b" + b;
> CPPUNIT_ASSERT_EQUAL(OUString("ba"), b.makeStringAndClear());
would indeed easily fail with
> equality assertion failed
> - Expected: ba
> - Actual : bb
Change-Id: I3108c18b7c941953a73b5731d9973914b7ba1fbe
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152495
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'vcl/source/control')
-rw-r--r-- | vcl/source/control/fmtfield.cxx | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/vcl/source/control/fmtfield.cxx b/vcl/source/control/fmtfield.cxx index de5713261e83..69497dec2c1b 100644 --- a/vcl/source/control/fmtfield.cxx +++ b/vcl/source/control/fmtfield.cxx @@ -1117,7 +1117,7 @@ void DoubleCurrencyField::UpdateCurrencyFormat() OUString sSymbol = getCurrencySymbol(); sSymbol = comphelper::string::strip(sSymbol, ' '); - sNewFormat = + OUString sTemp = "[$" + sSymbol + "] " + sNewFormat // for negative values : $ -0.00, not -$ 0.00... @@ -1128,6 +1128,8 @@ void DoubleCurrencyField::UpdateCurrencyFormat() + sSymbol + "] -" + sNewFormat; + + sNewFormat = sTemp; } else { |