Подробности

[В начало]

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

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

Поведение basic_string::compare может не соответствовать ISO/IEC 14882 на IA64-системах

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

Из описания функции basic_string::compare(size_t, size_t, basic_string const&) (раздел 21.3.6.8):

int compare(size_type pos1, size_type n1, const basic_string& str) const;
Returns: basic_string(*this,pos1,n1).compare(str).

Как указано в этом же разделе документации, функция
    int compare(const basic_string& str) const
использует функцию char_traits::compare() для сравнения char*-последовательностей. Эта функция, в свою очередь вызывает для этой цели функцию __builtin_memcmp().

Однако результат, возвращаемый функцией __builtin_memcmp() на IA64, зависит не только от значений её аргументов.

Это приводит к тому, например, что в некоторых случаях (см. пример) при вызове compare(pos1, n1, str) возвращается 32, а при вызове basic_string(*this,pos1,n1).compare(str) возвращается 1. Результаты имеют один и тот же знак, но всё же не совпадают - поэтому формально требование, сформулированное в разделе 21.3.6.8 стандарта ISO C++ нарушается.

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

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

Пример

#include <string>
#include <cstdio>

#define CHAR_T     char
#define STR_LEFT   "The quick brown foxy"
#define STR_RIGHT  "e quick brown Fox"
#define POS_VALUE  2
#define N_VALUE    str_src.size() - 3

using namespace std;

int
main(int argc, char* argv[])
{
    basic_string<CHAR_T> str_src(STR_LEFT);
    basic_string<CHAR_T> str(STR_RIGHT);
    
    size_t pos = POS_VALUE;
    size_t n = N_VALUE;

    basic_string<CHAR_T>    str1(str_src, pos, n);
    
    int ret_mustbe = str1.compare(str);
    int ret = str_src.compare(pos, n, str);

    printf("The function should have returned %d, it returned %d\n", 
        ret_mustbe, ret);
    
    return 0;
}

Компонент

libstdc++

Окружение

Архитектуры

IA64

[В начало]