diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2019-10-07 17:31:02 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2019-10-08 11:30:17 +0200 |
commit | 8f4fdb405a8470b9d06ab14ced120da89b213e82 (patch) | |
tree | 74451732aec125ac12f92f1982f1ede100d10cc6 /include/basic | |
parent | c18280e6b2b22936f00e1c88606eadc6dfd9e100 (diff) |
New loplugin:classmemaccess
...to complement and improve upon GCC's -Wclass-memaccess. See the comment at
the head of compilerplugins/clang/classmemaccess.cxx for details. (It is not
yet clear to me whether we would want to get this upstreamed into Clang.)
35d21e4bf6f66b3bbc7a44fcf184cb721b524a94 "Remove redundant memsets" was a case
that benefited from looking through toplevel casts to void*. (Though the code
in include/basic/sbxvar.hxx needs a slightly more verbose way to deliberately
silence the warning now.)
d03041e19215592f21ba1222d3cfa29e1f94260a "Drop bogus memsets" is one example of
various cases that GCC -Wclass-memaccess failed to catch due to the use of array
instead of pointer types.
Change-Id: I6a9bfc34e3536834af35fdf4fb7ceeb31f31f8c0
Reviewed-on: https://gerrit.libreoffice.org/80421
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'include/basic')
-rw-r--r-- | include/basic/sbxvar.hxx | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/include/basic/sbxvar.hxx b/include/basic/sbxvar.hxx index 446f1fe4c1ec..270db0d137af 100644 --- a/include/basic/sbxvar.hxx +++ b/include/basic/sbxvar.hxx @@ -81,9 +81,10 @@ struct SbxValues void clear(SbxDataType type) { // A hacky way of zeroing the union value corresponding to the given type (even though the // relevant zero value need not be represented by all-zero bits, in general) without evoking - // GCC 8 -Wclass-memaccess, and without having to turn the anonymous union into a non- - // anonymous one: - std::memset(static_cast<void *>(this), 0, offsetof(SbxValues, eType)); + // GCC 8 -Wclass-memaccess or loplugin:classmemaccess, and without having to turn the + // anonymous union into a non-anonymous one: + auto const p = static_cast<void *>(this); + std::memset(p, 0, offsetof(SbxValues, eType)); eType = type; } }; |