[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#259196: marked as done (libstdc++5: mixed signed/unsigned char comparison in std::char_traits<char>)



Your message dated Sun, 22 May 2005 12:16:19 +0200
with message-id <87mzqnk1l8.fsf@debian.org>
and subject line Bug#259196: libstdc++5: mixed signed/unsigned char comparison in std::char_traits<char>
has caused the attached Bug report to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what I am
talking about this indicates a serious mail system misconfiguration
somewhere.  Please contact me immediately.)

Debian bug tracking system administrator
(administrator, Debian Bugs database)

--------------------------------------
Received: (at submit) by bugs.debian.org; 13 Jul 2004 11:51:47 +0000
>From giuseppe@bohr.pisa.iol.it Tue Jul 13 04:51:47 2004
Return-path: <giuseppe@bohr.pisa.iol.it>
Received: from mail2.webmessenger.it (mail2a.webresidence.it) [193.70.193.55] 
	by spohr.debian.org with esmtp (Exim 3.35 1 (Debian))
	id 1BkLp5-000683-00; Tue, 13 Jul 2004 04:51:47 -0700
Received: from bohr.pisa.iol.it (193.76.233.84) by mail2a.webresidence.it (7.0.027-DD01)
        id 40F2821E000006E1; Tue, 13 Jul 2004 13:51:15 +0200
Received: from giuseppe by bohr.pisa.iol.it with local (Exim 4.32)
	id 1BkLoZ-0000oo-4e; Tue, 13 Jul 2004 13:51:15 +0200
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
From: giuseppe bonacci <g.bonacci@libero.it>
To: Debian Bug Tracking System <submit@bugs.debian.org>
Subject: libstdc++5: mixed signed/unsigned char comparison in std::char_traits<char>
X-Mailer: reportbug 2.62
Date: Tue, 13 Jul 2004 13:51:10 +0200
Message-Id: <E1BkLoZ-0000oo-4e@bohr.pisa.iol.it>
Sender: peppe <giuseppe@bohr.pisa.iol.it>
Content-Transfer-Encoding: Quoted-Printable
Delivered-To: submit@bugs.debian.org
X-Spam-Checker-Version: SpamAssassin 2.60-bugs.debian.org_2004_03_25 
	(1.212-2003-09-23-exp) on spohr.debian.org
X-Spam-Status: No, hits=-8.0 required=4.0 tests=BAYES_00,HAS_PACKAGE 
	autolearn=no version=2.60-bugs.debian.org_2004_03_25
X-Spam-Level: 

Package: libstdc++5
Version: 1:3.3.4-2
Severity: minor

I report this as "minor" since I don't know if it's really a bug or
standard behaviour that I'm not understanding.

The following program (to be compiled with g++ 3.x)

#include <iostream>
#include <string>
#define BLURB(x) #x << "\t=3D=3D " << (x) << '\n'
int main()
{
    std::basic_string<char> s1, s2;
    s1 =3D 0xe0;
    s2 =3D 'a';
    std::cout << "s1 =3D=3D '" << s1 << "'\ns2 =3D=3D '" << s2 << "'\n";
    std::cout << BLURB( (s1 < s2) );
    std::cout << BLURB( (s1[0] < s2[0]) );
    std::cout << BLURB( std::char_traits<char>::lt(s1[0], s2[0]) );
    std::cout << BLURB( std::char_traits<char>::compare(s1.c_str(),
                s2.c_str(), 1) );
    std::cout << BLURB( s1.compare(s2) );
    return 0;
}

produces this output on my x86 linux pc:

s1 =3D=3D '=E0'
s2 =3D=3D 'a'
(s1 < s2)       =3D=3D 0
(s1[0] < s2[0]) =3D=3D 1
std::char_traits<char>::lt(s1[0], s2[0])        =3D=3D 1
std::char_traits<char>::compare(s1.c_str(), s2.c_str(), 1)      =3D=3D 1
s1.compare(s2)  =3D=3D 1

The above results are counter-intuitive, but agree with the
behaviour of C standard library (1999 standard):=20
- strcmp and memcmp treat their arguments as unsigned char*, so
  that strcmp(s1.c_str(), s2.c_str()) > 0 (meaning s1 > s2)
- on my platform char is signed, so s1[0] < s2[0] (because s1[0] < 0)

On the other hand, Stroustrup's TC++PL, section 20.2.1 "Character traits"
reports "The compare() function uses lt() and eq() to compare characters.=
",=20
so I'd expect
    std::char_traits<char>::lt(s1[0], s2[0])
and=20
    std::char_traits<char>::compare(s1.c_str(), s2.c_str(), 1)
to return consistent results, which they do not.  As a side effect,
s1.compare(s2) is not consistent with std::char_traits<char>::lt()
either.

As far as I can see, GNU libstdc++5 implementation of=20
std::char_traits<char>::compare() uses memcmp() instead of lt(), and so
inherits the unsigned char comparison, while std::char_traits<char>::lt()
plainly uses '<' to compare its arguments, keeping them signed.

It's quite likely that I am missing something in Stroustrup's book.
What does the standard mandate?

Best regards
giuseppe

-- System Information:
Debian Release: testing/unstable
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: i386 (i686)
Kernel: Linux 2.4.26-1-686
Locale: LANG=3DC, LC_CTYPE=3DC

Versions of packages libstdc++5 depends on:
ii  gcc-3.3-base                1:3.3.4-2    The GNU Compiler Collection =
(base=20
ii  libc6                       2.3.2.ds1-13 GNU C Library: Shared librar=
ies an
ii  libgcc1                     1:3.3.4-2    GCC support library

-- no debconf information

---------------------------------------
Received: (at 259196-done) by bugs.debian.org; 22 May 2005 10:16:52 +0000
>From falk@debian.org Sun May 22 03:16:52 2005
Return-path: <falk@debian.org>
Received: from smtp06.web.de [217.72.192.224] 
	by spohr.debian.org with esmtp (Exim 3.35 1 (Debian))
	id 1DZnVs-0000KL-00; Sun, 22 May 2005 03:16:52 -0700
Received: from [213.23.67.203] (helo=juist)
	by smtp06.web.de with asmtp (TLSv1:DES-CBC3-SHA:168)
	(WEB.DE 4.105 #291)
	id 1DZnVN-0006yV-00
	for 259196-done@bugs.debian.org; Sun, 22 May 2005 12:16:21 +0200
Received: from falk by juist with local (Exim 4.50)
	id 1DZnVL-0000z8-Ua
	for 259196-done@bugs.debian.org; Sun, 22 May 2005 12:16:19 +0200
To: 259196-done@bugs.debian.org
Subject: Bug#259196: libstdc++5: mixed signed/unsigned char comparison in
 std::char_traits<char>
From: Falk Hueffner <falk@debian.org>
X-Face: "iUeUu$b*W_"w?tV83Y3*r:`rh&dRv}$YnZ3,LVeCZSYVuf[Gpo*5%_=/\_!gc_,SS}[~xZ
 wY77I-M)xHIx:2f56g%/`SOw"Dx%4Xq0&f\Tj~>|QR|vGlU}TBYhiG(K:2<T^
Date: Sun, 22 May 2005 12:16:19 +0200
Message-ID: <87mzqnk1l8.fsf@debian.org>
User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.5 (cilantro, linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Sender: falk@debian.org
X-Sender: falk.hueffner@web.de
Delivered-To: 259196-done@bugs.debian.org
X-Spam-Checker-Version: SpamAssassin 2.60-bugs.debian.org_2005_01_02 
	(1.212-2003-09-23-exp) on spohr.debian.org
X-Spam-Status: No, hits=-4.0 required=4.0 tests=BAYES_00,HAS_BUG_NUMBER,
	RCVD_IN_DSBL autolearn=no version=2.60-bugs.debian.org_2005_01_02
X-Spam-Level: 

Hi,

acccording to http://gcc.gnu.org/PR15276, the behaviour has now been
codified by a DR as correct, so closing.

-- 
	Falk



Reply to: