0

これは私には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;
}

サニタイザーなしでコンパイルし、ユーザー指定の値「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
4

1 に答える 1

3

boolalphaはデフォルトでオフになっていますcin。書かれているように、プログラムは数値フラグ、つまり1 0 1. true false true有効にする必要があるような入力をサポートするにはboolalpha

    bool c1, c2, c3;
    cin >> std::boolalpha; // add this line
    cin >> c1 >> c2 >> c3;
于 2015-11-11T01:48:32.840 に答える