Ошибка дезинфицирующего средства g++ 4.9 с логическим анализом cin в Linux (64-разрядная версия Ubuntu 12.04)

Для меня это выглядит как ошибка 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;
}

Вот что показывает моя оболочка при компиляции без дезинфицирующих средств и запуске с заданными пользователем значениями «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, и все остальное верно), но это не главное. Вот сочная часть: добавление флагов дезинфицирующего средства, но предоставление одних и тех же входных данных показывает разные результаты:

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

person aho    schedule 11.11.2015    source источник
comment
В С++ 11 cin >> c1 требуется для установки c1 в false (поскольку ваш ввод не был целым числом); но до C++11 было указано оставить c1 без изменений. c2 и c3 остаются неопределенными в обоих случаях, поскольку поток уже находится в состоянии сбоя из-за невозможности прочитать c1 (см. c-on-failure">эта тема). Ваш вывод согласуется с тем, что c3 является неопределенным.   -  person M.M    schedule 11.11.2015
comment
ах, хорошая находка! +1 от меня, спасибо @M.M.   -  person aho    schedule 11.11.2015


Ответы (1)


boolalpha по умолчанию отключен для cin. Как написано, ваша программа ожидает числовые флаги, то есть 1 0 1. Для поддержки ввода типа true false true вам необходимо включить boolalpha:

    bool c1, c2, c3;
    cin >> std::boolalpha; // add this line
    cin >> c1 >> c2 >> c3;
person Adam    schedule 11.11.2015
comment
Интересно, я думал, что пробовал это, не заметив никаких различий, но теперь я не могу воспроизвести эффект, который я видел; должно быть, был на крэке. Спасибо, теперь это работает, поэтому я закрою это. - person aho; 11.11.2015