繁体   English   中英

在Linux上使用cin解析布尔值的g ++ 4.9消毒剂错误(ubuntu 12.04 64位)

[英]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

cin默认情况下, boolalpha是关闭的。 如所写,您的程序需要数字标志,即1 0 1 为了支持像true false true输入,您需要启用boolalpha

    bool c1, c2, c3;
    cin >> std::boolalpha; // add this line
    cin >> c1 >> c2 >> c3;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM