aboutsummaryrefslogtreecommitdiff
path: root/gdb/value.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2023-03-02 15:26:55 -0500
committerSimon Marchi <simon.marchi@efficios.com>2023-03-02 16:02:50 -0500
commit344642355ce401c27ea2d57a69d83ec554a9c2bb (patch)
tree94797bceede4b9b4f8ab14c088c49b2baec70346 /gdb/value.c
parent70728e1d396475e8e630bfdd3fb8e8c8211bdbbd (diff)
downloadgdb-344642355ce401c27ea2d57a69d83ec554a9c2bb.zip
gdb-344642355ce401c27ea2d57a69d83ec554a9c2bb.tar.gz
gdb-344642355ce401c27ea2d57a69d83ec554a9c2bb.tar.bz2
gdb: fix -Wmaybe-uninitialized warning in value.c
Since commit 11470e70ea0d ("gdb: store internalvars in an std::map"), bulding with -O2, with g++ 11.3.0 on Ubuntu 22.04, I see: CXX value.o In constructor ‘internalvar::internalvar(internalvar&&)’, inlined from ‘constexpr std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char*&; _U2 = internalvar; typename std::enable_if<(std::_PCC<true, _T1, _T2>::_MoveConstructiblePair<_U1, _U2>() && std::_PCC<true, _T1, _T2>::_ImplicitlyMoveConvertiblePair<_U1, _U2>()), bool>::type <anonymous> = true; _T1 = const char*; _T2 = internalvar]’ at /usr/include/c++/11/bits/stl_pair.h:353:35, inlined from ‘constexpr std::pair<typename std::__strip_reference_wrapper<typename std::decay<_Tp>::type>::__type, typename std::__strip_reference_wrapper<typename std::decay<_Tp2>::type>::__type> std::make_pair(_T1&&, _T2&&) [with _T1 = const char*&; _T2 = internalvar]’ at /usr/include/c++/11/bits/stl_pair.h:572:72, inlined from ‘internalvar* create_internalvar(const char*)’ at /home/smarchi/src/binutils-gdb/gdb/value.c:1933:52: /home/smarchi/src/binutils-gdb/gdb/value.c:1831:8: warning: ‘<unnamed>.internalvar::u’ may be used uninitialized [-Wmaybe-uninitialized] 1831 | struct internalvar | ^~~~~~~~~~~ /home/smarchi/src/binutils-gdb/gdb/value.c: In function ‘internalvar* create_internalvar(const char*)’: /home/smarchi/src/binutils-gdb/gdb/value.c:1933:76: note: ‘<anonymous>’ declared here 1933 | auto pair = internalvars.emplace (std::make_pair (name, internalvar (name))); | ^ This is because the union field internalvar::u is not initialized when constructing the temporary internalvar object above. That object is then used for move-construction, and the (implicit) move constructor copies the uninitialized bytes of field u over from the temporary object to the new internalvar object. The compiler therefore complains that we use uninitialized bytes. I don't think it's really a problem, because the internalvar object is in the `kind == INTERNALVAR_VOID` state, in which the contents of the union is irrelevant. Still, mute the warning by default-initializing the union. Change-Id: I70c392842f35255f50d8e63f4099cb6685366fb7 Reviewed-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb/value.c')
-rw-r--r--gdb/value.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gdb/value.c b/gdb/value.c
index 10a7ce0..7b4df33 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -1853,7 +1853,7 @@ struct internalvar
enum internalvar_kind kind = INTERNALVAR_VOID;
- union internalvar_data u;
+ union internalvar_data u {};
};
/* Use std::map, a sorted container, to make the order of iteration (and