This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix PR libstdc++/19510: Uninitialized variable in someiterators


Volker Reichelt wrote:

PR libstdc++/19510 is about a warning that is triggered from within the
libstdc++ headers. When compiling the following code snippet with
"-Wall -O3" using mainline

===============================================
#include<vector>
#include<list>

std::vector<std::list<int>::iterator> v(1);
===============================================

the following warning is issued:

/long_path/stl_construct.h: In function 'void
__static_initialization_and_destruction_0(int, int)':
/long_path/stl_construct.h:81: warning: 'SR.133' is used uninitialized in this
function



I apologise if this is obvious / stupid, but is this really a bug in the class, or in the error message?

I get the same error arriving from:

#include<vector>

struct ptrwrapper {
int* a;
ptrwrapper() {}
};

std::vector<ptrwrapper> v(1);

Which is surely correct code? I imagine what is happening is that the pointer is being copied, however there is (I think?) nothing wrong with copying an unassigned pointer, and I don't see what advantage is gained by assigning the pointer, and the obvious (possibly slight) disadvantage is that now we have an extra assignment.

Chris


Apart from the strange variable name 'SR.133' (which is a different issue)
the warning seems to be justified as the default constructor of
_List_iterator does not initialize the pointer _M_node.
_List_const_iterator, _Rb_tree_iterator, and _Rb_tree_const_iterator
have the same problem.

The following patch fixes that by adding the appropriate initializations.
Due to changed line numbers the testsuite needs some trivial tweaks.

Bootstrapped and regtested on i686-pc-linux-gnu.
OK to apply to mainline?

Btw, the initialization is missing in 3.4, too. But the warning is not
triggered. Should the patch be applied there, too?

Regards,
Volker


2005-01-20 Volker Reichelt <reichelt@igpm.rwth-aachen.de>


	PR libstdc++/19510
	* include/bits/stl_list.h (_List_iterator): Initialize _M_node
	in constructor.
	(_List_const_iterator): Likewise.
	* include/bits/stl_tree.h (_Rb_tree_iterator): Likewise.
	(_Rb_tree_const_iterator): Likewise.

	* testsuite/23_containers/map/operators/1_neg.cc: Adjust line numbers.
	* testsuite/23_containers/set/operators/1_neg.cc: Likewise.


=================================================================== --- gcc/libstdc++-v3/include/bits/stl_list.h 19 Nov 2004 12:44:09 -0000 1.45 +++ gcc/libstdc++-v3/include/bits/stl_list.h 18 Jan 2005 18:49:06 -0000 @@ -119,7 +119,8 @@ namespace _GLIBCXX_STD typedef _Tp* pointer; typedef _Tp& reference;

-      _List_iterator() { }
+      _List_iterator()
+      : _M_node() { }

      _List_iterator(_List_node_base* __x)
      : _M_node(__x) { }
@@ -195,7 +196,8 @@ namespace _GLIBCXX_STD
      typedef const _Tp*                    pointer;
      typedef const _Tp&                    reference;

-      _List_const_iterator() { }
+      _List_const_iterator()
+      : _M_node() { }

      _List_const_iterator(const _List_node_base* __x)
      : _M_node(__x) { }
====================================================================
--- gcc/libstdc++-v3/include/bits/stl_tree.h	13 Oct 2004 00:11:13 -0000	1.40
+++ gcc/libstdc++-v3/include/bits/stl_tree.h	18 Jan 2005 21:48:51 -0000
@@ -161,7 +161,8 @@ namespace std
      typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
      typedef _Rb_tree_node<_Tp>*           _Link_type;

-      _Rb_tree_iterator() { }
+      _Rb_tree_iterator()
+      : _M_node() { }

      _Rb_tree_iterator(_Link_type __x)
      : _M_node(__x) { }
@@ -231,7 +232,8 @@ namespace std
      typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr;
      typedef const _Rb_tree_node<_Tp>*           _Link_type;

-      _Rb_tree_const_iterator() { }
+      _Rb_tree_const_iterator()
+      : _M_node() { }

_Rb_tree_const_iterator(_Link_type __x)
: _M_node(__x) { }
===================================================================
--- gcc/libstdc++-v3/testsuite/23_containers/map/operators/1_neg.cc 23 Sep 2004 21:27:25 -0000 1.5
+++ gcc/libstdc++-v3/testsuite/23_containers/map/operators/1_neg.cc 19 Jan 2005 22:10:53 -0000
@@ -41,5 +41,5 @@ void test01()
test &= itr == mapByName.end(); // { dg-error "no" } }
-// { dg-error "candidates are" "" { target *-*-* } 208 } -// { dg-error "candidates are" "" { target *-*-* } 212 }
+// { dg-error "candidates are" "" { target *-*-* } 209 }
+// { dg-error "candidates are" "" { target *-*-* } 213 }
===================================================================
--- gcc/libstdc++-v3/testsuite/23_containers/set/operators/1_neg.cc 23 Sep 2004 21:27:25 -0000 1.5
+++ gcc/libstdc++-v3/testsuite/23_containers/set/operators/1_neg.cc 19 Jan 2005 22:13:26 -0000
@@ -39,5 +39,5 @@ void test01()
test &= itr == setByName.end(); // { dg-error "no" } }


-// { dg-error "candidates are" "" { target *-*-* } 281 } -// { dg-error "candidates are" "" { target *-*-* } 285 }
+// { dg-error "candidates are" "" { target *-*-* } 283 }
+// { dg-error "candidates are" "" { target *-*-* } 287 }
===================================================================







Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]