stdcxx-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Farid Zaripov (JIRA)" <j...@apache.org>
Subject [jira] Created: (STDCXX-854) incorrect using the caching array in ctype<wchar_t>::narrow(wchar_t, char)
Date Fri, 11 Apr 2008 16:26:04 GMT
incorrect using the caching array in ctype<wchar_t>::narrow(wchar_t, char)
--------------------------------------------------------------------------

                 Key: STDCXX-854
                 URL: https://issues.apache.org/jira/browse/STDCXX-854
             Project: C++ Standard Library
          Issue Type: Bug
          Components: 22. Localization
    Affects Versions: 4.2.0, 4.1.4, 4.1.3, 4.1.2
         Environment: All
            Reporter: Farid Zaripov
            Assignee: Farid Zaripov
             Fix For: 4.2.1


The 22.locale.ctype.narrow test fails with number of assertions. The reason is casting the
at least 16-bit wchar_t value to 8-bit unsigned char and using this value as index in cache
table. As a result the index always fits the table of size 256 elements.

The proposed patch:

{noformat}
Index: include/loc/_ctype.h
===================================================================
--- include/loc/_ctype.h	(revision 646660)
+++ include/loc/_ctype.h	(working copy)
@@ -541,20 +541,21 @@
 inline char
 ctype<wchar_t>::narrow (char_type __c, char __dfault) const
 {
-    const _RWSTD_SIZE_T __inx = _RWSTD_STATIC_CAST (unsigned char, __c);
-
     // optimize away all but the first call to the virtual do_widen()
-    if (   __inx < sizeof _C_narrow_tab / sizeof *_C_narrow_tab
-        && _C_narrow_tab [__inx])
-        return _C_narrow_tab [__inx];
+    if (   0 <= __c
+        && __c < sizeof _C_narrow_tab / sizeof *_C_narrow_tab
+        && _C_narrow_tab [__c])
+        return _C_narrow_tab [__c];
 
     // template argument provided to work around an HP aCC bug (PR #27087)
     ctype<wchar_t>* const __self = _RWSTD_CONST_CAST (ctype<wchar_t>*, this);
 
     const char __ch = do_narrow (__c, __dfault);
 
-    if (__inx < sizeof _C_narrow_tab / sizeof *_C_narrow_tab && __ch != __dfault)
-        __self->_C_narrow_tab [__inx] = __ch;
+    if (   0 <= __c
+        && __c < sizeof _C_narrow_tab / sizeof *_C_narrow_tab
+        && __ch != __dfault)
+        __self->_C_narrow_tab [__c] = __ch;
 
     return __ch;
 }
{noformat}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message