This is the mail archive of the
gcc-prs@gcc.gnu.org
mailing list for the GCC project.
Re: libstdc++/7961: compare( char *) implemented incorrectly.
- From: Andreas Schwab <schwab at suse dot de>
- To: nobody at gcc dot gnu dot org
- Cc: gcc-prs at gcc dot gnu dot org,
- Date: 18 Sep 2002 08:46:04 -0000
- Subject: Re: libstdc++/7961: compare( char *) implemented incorrectly.
- Reply-to: Andreas Schwab <schwab at suse dot de>
The following reply was made to PR libstdc++/7961; it has been noted by GNATS.
From: Andreas Schwab <schwab@suse.de>
To: john.carter@tait.co.nz
Cc: gcc-gnats@gcc.gnu.org
Subject: Re: libstdc++/7961: compare( char *) implemented incorrectly.
Date: Wed, 18 Sep 2002 10:39:54 +0200
john.carter@tait.co.nz writes:
|> A correct implementation would be...
|> template<typename _CharT, typename _Traits, typename _Alloc>
|> int
|> basic_string<_CharT, _Traits, _Alloc>::
|> compare(const _CharT* __s) const
|> {
|> size_type __size = this->size();
|> size_type __s_size = traits_types::length(__s);
|> size_type __min = __size;
|> if ( __size > __s_size)
|> __min = __s_size;
|>
|> int __r = traits_type::compare(_M_data(), __s, __min);
|> if (!__r)
|> __r = __size - _s_size;
|>
|> return __r;
|> }
This is not correct either, because __size - __s_size may overflow the
range of int. Try this instead:
if (!__r)
__r = (__size > __s_size) - (__size < __s_size);
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux AG, Deutschherrnstr. 15-19, D-90429 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."