我正在调试的程序此时正在接收SIGINT:
#0 0x00007ffff590784e in toupper () from /lib/x86_64-linux-gnu/libc.so.6
有问题的代码是:
std::string search = name;
std::transform(search.begin(), search.end(), search.begin(), ::toupper);
现在我不知道内容是什么,但允许使用特殊符号。
我已经知道我在这里做错了,实际上是UTF-8,我应该在执行大小写转换之前将其转换为std::wstring
。然而,即使我这样做的方式不对,我也不明白它为什么会崩溃。
toupper
因SIGINT而崩溃的原因是什么?我怎样才能避免一些用户输入这个到我的服务器应用程序?
答案 0 :(得分:2)
UTF-8使用的数字在被视为有符号字符时会显示为负数(这是常见的)。将这些负数提供给toupper
会产生不确定的行为。
尝试:
std::transform(search.begin(), search.end(), search.begin(),
[](unsigned char ch) {return ::toupper(ch); });
...看看事情是否有所改善。