распределитель основных_строк

мне интересно, что это делает:

std::basic_string<char, std::char_traits<char>, std::allocator<char>>::
basic_string<char, std::char_traits<char>, std::allocator<char>>
(&myText, "hello world");

Мое первое предположение состоит в том, что он выделяет «привет мир» myText переменная
если это правда, то что он делает в этом случае:

  if ( v106 == v67 ||
std::basic_string<char, std::char_traits<char>, std::allocator<char>>::
basic_string<char, std::char_traits<char>, std::allocator<char>>
(&v109,"program"), v137 = 1)
{
BYTE3(v95) = 0;
}

это не совсем условие …

2

Решение

Я думаю, это вывод из плагина декомпилятора Hex-Ray для IDA, я прав? Это способ отображения вызова конструктора std::string учебный класс. v109 это память, выделенная в стеке для хранения std::string экземпляр, а второй параметр, "hello world", строка для инициализации.

В случаях, когда множественные условия приводят к одному и тому же результирующему коду, компиляторы часто выбирают повторное использование (эквивалентного) фрагмента кода из предыдущего условия, чтобы минимизировать размер сгенерированного байт-кода. Плагин декомпилятора Hex-Ray часто отображает их, используя Comma-оператор до версии 1.5 — более новые версии декомпилятора лучшее понимание таких ситуаций.

if (v106 == v67)
BYTE3(v95) = 0;

std::basic_string<char, std::char_traits<char>,
std::allocator<char>>
::basic_string<char,
std::char_traits<char>,
std::allocator<char>>(&v109,"program");
v137 = 1;
BYTE3(v95) = 0;

Это больше похоже на фактический источник. Замена огромного std::basic_string<...> построить с простым std::string объявление делает его еще более читабельным.

if (v106 == v67)
BYTE3(v95) = 0;

std::string v109("program");
v137 = 1;
BYTE3(v95) = 0;
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]