• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Баг или фича?

  • Автор темы shisik
  • Дата начала
S

shisik

Сейчас столкнулся со странность в компиляторе 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

shisik

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!