在 linux(ubuntu 12.04 64 位)上使用 cin 解析布尔值的 g++ 4.9 消毒程序错误
g++ 4.9 sanitizer bug with cin parsing boolean on linux (ubuntu 12.04 64-bit)
对我来说,这看起来像是一个 g++ 错误(可能与消毒剂相关),但我想知道是否有人使用 clang(假设 gcc 消毒剂来自 clang afaik)或不同的 g++ 版本,会有不同的结果吗?
这是一个简单的程序,它从用户的标准输入中读取 3 个值,尝试解析它们并打印它们(我还显示了 cin 标志的状态,以防有人需要它们)
#include <iostream>
using namespace std;
int main ()
{
bool c1, c2, c3;
cin >> c1 >> c2 >> c3;
cout << boolalpha << "Good: " << cin.good();
cout << " Bad: " << cin.bad();
cout << " Fail: " << cin.fail();
cout << " EOF: " << cin.eof();
cout << endl;
cout << c1 << ", " << c2 << ", " << c3 << ", " << endl;
return 0;
}
这是我的 shell 在没有消毒剂和 运行 使用用户提供的值 "true false 1":
编译时显示的内容
0:48:03: 0 aho@ubuntu ~/dev/cpp$ g++ -Wall cpp1.cc -o a.out -g3 && ./a.out
true false 1
Good: false Bad: false Fail: true EOF: false
false, false, false,
我觉得它没有打印 "true, true, true" 有点令人惊讶(我认为只有 '0' 会被解析为 false,其他任何东西都是 true),但这不是重点。这是有趣的一点:添加消毒剂标志但提供相同的输入显示不同的结果:
0:48:21: 0 aho@ubuntu ~/dev/cpp$ g++ -Wall cpp1.cc -o a.out -g3 -fsanitize=address -fsanitize=leak -fsanitize=undefined && ./a.out
true false 1
Good: false Bad: false Fail: true EOF: false
cpp1.cc:12:45: runtime error: load of value 23, which is not a valid value for type 'bool'
false, false, true,
最后的细节(如果你想要更多,请 lmk)
gcc version 4.9.2 (Ubuntu 4.9.2-0ubuntu1~12.04)
Linux ubuntu 3.8.0-44-generic #66~precise1-Ubuntu SMP Tue Jul 15 04:01:04 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
对于 cin
,boolalpha
默认关闭。如所写,您的程序需要数字标志,即 1 0 1
。要支持像 true false true
这样的输入,您需要启用 boolalpha
:
bool c1, c2, c3;
cin >> std::boolalpha; // add this line
cin >> c1 >> c2 >> c3;
对我来说,这看起来像是一个 g++ 错误(可能与消毒剂相关),但我想知道是否有人使用 clang(假设 gcc 消毒剂来自 clang afaik)或不同的 g++ 版本,会有不同的结果吗?
这是一个简单的程序,它从用户的标准输入中读取 3 个值,尝试解析它们并打印它们(我还显示了 cin 标志的状态,以防有人需要它们)
#include <iostream>
using namespace std;
int main ()
{
bool c1, c2, c3;
cin >> c1 >> c2 >> c3;
cout << boolalpha << "Good: " << cin.good();
cout << " Bad: " << cin.bad();
cout << " Fail: " << cin.fail();
cout << " EOF: " << cin.eof();
cout << endl;
cout << c1 << ", " << c2 << ", " << c3 << ", " << endl;
return 0;
}
这是我的 shell 在没有消毒剂和 运行 使用用户提供的值 "true false 1":
编译时显示的内容0:48:03: 0 aho@ubuntu ~/dev/cpp$ g++ -Wall cpp1.cc -o a.out -g3 && ./a.out
true false 1
Good: false Bad: false Fail: true EOF: false
false, false, false,
我觉得它没有打印 "true, true, true" 有点令人惊讶(我认为只有 '0' 会被解析为 false,其他任何东西都是 true),但这不是重点。这是有趣的一点:添加消毒剂标志但提供相同的输入显示不同的结果:
0:48:21: 0 aho@ubuntu ~/dev/cpp$ g++ -Wall cpp1.cc -o a.out -g3 -fsanitize=address -fsanitize=leak -fsanitize=undefined && ./a.out
true false 1
Good: false Bad: false Fail: true EOF: false
cpp1.cc:12:45: runtime error: load of value 23, which is not a valid value for type 'bool'
false, false, true,
最后的细节(如果你想要更多,请 lmk)
gcc version 4.9.2 (Ubuntu 4.9.2-0ubuntu1~12.04)
Linux ubuntu 3.8.0-44-generic #66~precise1-Ubuntu SMP Tue Jul 15 04:01:04 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
cin
,boolalpha
默认关闭。如所写,您的程序需要数字标志,即 1 0 1
。要支持像 true false true
这样的输入,您需要启用 boolalpha
:
bool c1, c2, c3;
cin >> std::boolalpha; // add this line
cin >> c1 >> c2 >> c3;