-3

私がデバッグしているプログラムは、この時点で 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);

今のところ内容はわかりませんが、特殊な記号は許可されています。

std::wstring実際にはUTF-8であり、大文字と小文字の変換を実行する前に変換する必要があるため、ここで何か間違ったことをしていることはすでにわかっています。ただし、間違った方法で行っていたにもかかわらず、なぜクラッシュするのかわかりません。

toupperSIGINT でクラッシュする理由は何ですか? また、一部のユーザー入力がサーバー アプリケーションに影響を与えることを回避するにはどうすればよいでしょうか?

4

1 に答える 1

2

UTF-8 は、signed char として表示すると負に見える数値を使用します (これが通常です)。これらの負の数を にtoupper与えると、未定義の動作が発生します。

試す:

std::transform(search.begin(), search.end(), search.begin(), 
    [](unsigned char ch) {return ::toupper(ch); });

...そして、物事が少しうまくいかないかどうかを確認してください。

于 2013-10-16T03:12:15.100 に答える