мне интересно, что это делает:
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;
}
это не совсем условие …
Я думаю, это вывод из плагина декомпилятора 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;
Других решений пока нет …