Подробности

[В начало]

Проблема в реализации № S0677

Краткое описание

num_put<>::do_put(void*) неверно выполняет padding при adjustfield==internal

Подробное описание

Для классов num_put<char> и num_put<wchar_t> функция-член

iter_type put(iter_type out, ios_base& str, char_type fill, const void* val) const

неверно выполняет дополнение строки до нужной длины в случае, когда флаг adjustfield==internal: вместо заполнения после символов 0x происходит заполнение в начале строки.

Согласно описанию вариантов заполнения (22.2.2.2.2 p19):

adjustfield == internal and representation after stage 1 began with 0x or 0X - pad after x or X.

Приведённый ниже пример демонстрирует данную проблему(вывод чисел в стандартном потоке вывода cout реализован через num_get<> facet).

В данном примере в стандартный поток вывода выводится "  0x1", тогда как должно быть "0x  1", согласно стандарту.

Раздел стандарта

Linux Standard Base C++ Specification 3.2, Chapter 9. Libraries, 9.1. Interfaces for libstdcxx, который ссылается на ISO/IEC 14882: 2003 Programming languages -- C++, section 22.2.2.2.2

Пример

#include <iostream>
#include <locale>

using namespace std;
int main()
{
    void *p = (void*)0x1;
    cout.width(5);
    cout << internal << p << endl;
    // "  0x1" will be output while it should be "0x  1"
    return 0;
}

Компонент

libstdc++

Принято

GCC Bugzilla 38210

Статус

Исправлено в gcc-4.4.0

[В начало]