[Bug 272914] wcscmp is not ISO C compliant

[email protected]
Newsgroups gmane.os.freebsd.devel.standards
Message-ID <[email protected]/bugzilla/>
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=272914

            Bug ID: 272914
           Summary: wcscmp is not ISO C compliant
           Product: Base System
           Version: 13.2-RELEASE
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Some People
          Priority: ---
         Component: standards
          Assignee: [email protected]
          Reporter: [email protected]

ISO C 23 § 7.31.4.4.1 together with § 7.31.4.4.(1) and § 7.31.1.(6) specifies
that wcscmp must compare the string elements as wchar_t values, and that all
wchar_t values can legitimately occur.

On FreeBSD/x86_64, wchar_t is signed, i.e. equivalent to 'int'. In the test
case below, cmp must therefore come out positive, since a[0] > 0 > b[0]. But
wcscmp in FreeBSD compares the wchar_t values as if they were unsigned.

How to reproduce:
================================= foo.c =============================
#include <wchar.h>
int main ()
{
  /* This test fails on glibc < 2.15, musl libc 1.2.3, macOS 12.5,
     FreeBSD 13.2, NetBSD 9.0, OpenBSD 7.2, Solaris 11.4.  */
  wchar_t a[2] = { (wchar_t) 0x76547654, 0 };
  wchar_t b[2] = { (wchar_t) 0x9abc9abc, 0 };
  int cmp = wcscmp (a, b);
  return (!((wchar_t)-1 < 0 ? cmp > 0 : cmp < 0));
}
=====================================================================
$ cc foo.c
$ ./a.out
$ echo $?
1

-- 
You are receiving this mail because:
You are the assignee for the bug.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.