g++4.9清理了linux(ubuntu 12.04 64位)上带有cin解析布尔值的漏洞
g++ 4.9 sanitizer bug with cin parsing boolean on linux (ubuntu 12.04 64-bit)
对我来说,这看起来像是一个g++错误(可能与消毒液有关),但我想知道是否有人使用clang(假设gcc消毒液来自clang afaik)或不同的g++版本会有不同的结果?
这是一个简单的程序,它从用户的stdin读取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
boolalpha
默认情况下对cin
关闭。正如所写的,您的程序需要数字标志,即1 0 1
。要支持像true false true
这样的输入,您需要启用boolalpha
:
bool c1, c2, c3;
cin >> std::boolalpha; // add this line
cin >> c1 >> c2 >> c3;
相关文章:
- C++中的cin.ignore()函数不适用于整个流
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- Problems with std::cin.fail()
- 由cin中的字符串中未捕获空白引起的分割错误
- 在C++中使用Cin,我如何在1行中输入
- 将 cin 限制为只有一个
- cin >> int 给定一个字符串将 int 赋值为 0
- istream std::cin如何修改自定义istream缓冲区
- C++ 将 CIN 值存储到任何类型的数组中
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- cin 的十进制输入验证?
- Turbo C++ cin() 不能与 gets() 一起使用
- 使用 cin 时接受小数点后的 2 位数字
- 在 std::getline 和 std::cin 期间卡在循环中
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- 为什么我的两个 cin 语句没有在程序结束时运行?
- C++ cin.ignore() 跳过循环
- CIN是逻辑1还是0?
- 如何运行多行 cin?
- g++4.9清理了linux(ubuntu 12.04 64位)上带有cin解析布尔值的漏洞