Баг или фича?

shisik

Well-known member
26.08.2007
154
0
#1
Сейчас столкнулся со странность в компиляторе 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. При компиляции именно этого проекта оптимизации выключены. При сборке софта проблем никогда не возникало, а собрал я немало, как видно из названия ОС ;) А вот сейчас столкнулся с такой странностью. Это не сильно важно с практической точки зрения, но если это фича, то о ней хотелось бы узнать побольше.

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

Rififi

#3
shisik

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

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