在 2018/3/5 4:43, Martin Storsjö 写道:
> This fixes warnings when building libc++, like these:
> 
> libcxx/include/locale:1198:18: warning: array subscript is of type 'char' 
> [-Wchar-subscripts]
>             if (!isxdigit_l(*__ns, _LIBCPP_GET_C_LOCALE))
>                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/ctype.h:211:41: note: expanded from macro '__chvalidchk'
>  #define __chvalidchk(a,b) (__PCTYPE_FUNC[(a)] & (b))
>                                          ^~~~
> include/ctype.h:212:121: note: expanded from macro '_chvalidchk_l'
>  #define _chvalidchk_l(_Char,_Flag,_Locale) (!_Locale ? 
> __chvalidchk(_Char,_Flag) : ((_locale_t)_Locale)->locinfo->pctype[_Char] & 
> (_Flag))
>                                                                               
>                                            ^~~~~~
> 
> If the char would happen to be >= 0x80 (i.e. negative) this would also
> read outside of the bounds of the arrays.
> 
> Signed-off-by: Martin Storsjö <[email protected]>
> ---
>  mingw-w64-headers/crt/ctype.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/mingw-w64-headers/crt/ctype.h b/mingw-w64-headers/crt/ctype.h
> index 44629e1..5bd5643 100644
> --- a/mingw-w64-headers/crt/ctype.h
> +++ b/mingw-w64-headers/crt/ctype.h
> @@ -208,8 +208,8 @@ int __cdecl iswblank(wint_t _C);
>  _CRTIMP int __cdecl ___mb_cur_max_func(void);
>  #endif
>  
> -#define __chvalidchk(a,b) (__PCTYPE_FUNC[(a)] & (b))
> -#define _chvalidchk_l(_Char,_Flag,_Locale) (!_Locale ? 
> __chvalidchk(_Char,_Flag) : ((_locale_t)_Locale)->locinfo->pctype[_Char] & 
> (_Flag))
> +#define __chvalidchk(a,b) (__PCTYPE_FUNC[(unsigned char)(a)] & (b))
> +#define _chvalidchk_l(_Char,_Flag,_Locale) (!_Locale ? 
> __chvalidchk(_Char,_Flag) : ((_locale_t)_Locale)->locinfo->pctype[(unsigned 
> char)_Char] & (_Flag))

Here inside the bracket should be `(unsigned char)(_Char)`. Other than
that it looks good.

>  #define _ischartype_l(_Char,_Flag,_Locale) (((_Locale)!=NULL && 
> (((_locale_t)(_Locale))->locinfo->mb_cur_max) > 1) ? 
> _isctype_l(_Char,(_Flag),_Locale) : _chvalidchk_l(_Char,_Flag,_Locale))
>  #define _isalpha_l(_Char,_Locale) _ischartype_l(_Char,_ALPHA,_Locale)
>  #define _isupper_l(_Char,_Locale) _ischartype_l(_Char,_UPPER,_Locale)
> 


-- 
Best regards,
LH_Mouse


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to