
On Mon, Mar 20, 2017 at 9:07 PM, Vladimir Batov via Boost <boost@lists.boost.org> wrote:
On 2017-03-20 22:13, Peter Dimov via Boost wrote:
... The analyzer is correct; passing char to isspace is a well-known bug, should be cast to unsigned char. The accepted range of the argument to isspace is -1..255 (assuming 8 bit character table), with -1 being EOF, and the default promotion from char to int doesn't do the right thing when char is signed.
Thanks, Peter, for clarifications. Clearly, the analyzer is correct. My interpretation was that it was the documented isspace() behavior. So, I felt somewhat uncomfortable "correcting"/changing the documented behavior. Now that you mention that it is a well-known bug to be (unfortunately) addressed I did just that. Thanks again. Much appreciated.
Damn confused. WAS: std::isspace(ch); THEN: std::isspace(static_cast<unsigned char>(ch)); THEN I realized I needed wchar_t support and therefore needed also std::iswspace(). So, for such a seemingly trivial thing I ended up with the following ugliness: namespace cnv { template<typename char_type> struct char_test {}; template<> struct char_test<char> { static bool is_space(char ch) { return std::isspace(static_cast<unsigned char>(ch)); } }; template<> struct char_test<wchar_t> { static bool is_space(wchar_t ch) { return std::iswspace(ch); } }; template<typename char_type> bool is_space(char_type ch) { return char_test<char_type>::is_space(ch); } } That raises two questions. 1) Is it really the only way to go or I went senile or fell behind language-wise? 2) What about std::iswspace? Does it also need static_cast? Apologies for seemingly naive questions but I really feel startled.