Баг или фича?

Тема в разделе "Общие вопросы по С и С++", создана пользователем shisik, 6 сен 2011.

  1. shisik

    shisik Well-Known Member

    Регистрация:
    26 авг 2007
    Сообщения:
    154
    Симпатии:
    0
    Сейчас столкнулся со странность в компиляторе g++. Есть некоторый класс для работы с регулярными выражениеми. Переменная regExp - экземпляр этого класса. Программа проверяет строку на соответствие некоторому шаблону, выделяет из неё две подстроки и выводит их на экран следующим образом:

    Код (C++):
    std::cout << regExp.GetMatch(1) << ' ' << regExp.GetMatch(2) << std::endl;
    Но при этом выводится два раза первое соответствие (206 206 в моём случае, хотя должно быть 206 Partial Content). Я сначала думал, что ошибка в классе или в шаблоне, но потом обнаружил забавную вещь: если изменить код таким образом

    Код (C++):
    std::cout << regExp.GetMatch(1) << ' ';
    std::cout << regExp.GetMatch(2) << std::endl;
    ну т.е. разбить код на две строки, то выводятся две разные подстроки, как это и должно быть (206 Partial Content). Т.е. класс и шаблон нормальные, проблема по всей видимости в компиляторе, когда вместо вызова метода с параметром 2, он второй раз вызывается с параметром 1. Или же эта такая фича?

    Компилятор используется g++ версии 4.4.5; ОС - Gentoo amd64. При компиляции именно этого проекта оптимизации выключены. При сборке софта проблем никогда не возникало, а собрал я немало, как видно из названия ОС ;) А вот сейчас столкнулся с такой странностью. Это не сильно важно с практической точки зрения, но если это фича, то о ней хотелось бы узнать побольше.

    Кто-нибудь знает, в чём причина? Заранее спасибо.
     
  2. ierofant

    ierofant Гость

    Хорошо бы код посмотреть...
     
  3. Rififi

    Rififi Гость

    shisik

    Скорее всего класс регулярных выражений представляет из себя быдло-код, в котором функция GetMatch возвращает указатель на статический буфер.

    Решение - выкинуть этот класс, и использовать нормальную реализацию.
     
Загрузка...

Поделиться этой страницей