[
https://issues.apache.org/jira/browse/STDCXX-854?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Farid Zaripov updated STDCXX-854:
---------------------------------
Description:
The 22.locale.ctype and 22.locale.ctype.narrow tests are failing 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 in
ctype<wchar_t>::narrow(wchar_t, char). 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}
was:
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}
> 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.1.2, 4.1.3, 4.1.4, 4.2.0
> Environment: All
> Reporter: Farid Zaripov
> Assignee: Farid Zaripov
> Fix For: 4.2.1
>
> Original Estimate: 1h
> Remaining Estimate: 1h
>
> The 22.locale.ctype and 22.locale.ctype.narrow tests are failing 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 in
> ctype<wchar_t>::narrow(wchar_t, char). 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.