g ++ 4.9 ошибка sanitizer с логическим анализом синтаксиса cin на linux (ubuntu 12.04 64-bit)

Для меня это похоже на ошибку g ++ (возможно, связанную с sanitizer), но мне было интересно, будет ли у кого-нибудь с clang (учитывая gcc sanitizer от clang afaik) или другой версией g ++ результаты?

Это простая программа, которая читает 3 значения из stdin от пользователя, пытается проанализировать их и распечатать их (я также показываю состояние флагов 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

0

Решение

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]