Re[2]: реверс функции - надо узнать оригинал
От: disasm  
Дата: 18.05.10 18:05
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


К>
А>>B sub_8(B arg0, A arg4)
А>>{
А>>   ...
А>>     if (..)
А>>     {
А>>            ...
А>>            arg0.B::B(??); // под вопросами некие аргументы
А>>            ...
А>>     } else
А>>     {
А>>            ...
А>>            arg0.B::B(????); // под вопросами некие другие чем в первом случае аргументы
А>>            ...
А>>     }
А>>     return arg0;
А>>}
К>

А>>над первым арументом(arg0) кроме тех действий что я описал выше в функции, не происходит.
А>>тоесть он используеться именно два раза как конструктор и далее возращаеться на выходе из функции

К>Примерно так должна работать функция, возвращающая объект по значению.

К>Вызывающая сторона выделяет у себя на стеке память под временный объект и отдаёт указатель в функцию.
К>Функция в точке return (либо, если сделана оптимизация NRVO, в точке создания локального объекта) делает placement new и вызывает конструктор для данного указателя.

не совсем понял...

А>>функция очень похожа на operator<<

А>>но! меня настораживает что первый аргумент этой функции инициализируеться дважды в ней как конструктор!(и в этом я тоже на 100% уверен — именно два раза конструктор а не просто члены класса B)

К>Ну и правильно. Сколько разных объектов функция возвращает, столько разных конструкторов и вызывается.

К>Они же вызываются не вместе, а вместо друг друга. if-then-else.

да! но перед ними и после них есть определенные действия с разными переменными

А>>но извесно то что в любой оператор передаеться ссылка & на обьект, и уже повторно он врядли сможет проинициализироваться?!

А>>так же как видите функция sub_8 возращает этот же B класс

К>Я точно не смотрел, как у известных мне компиляторов выглядит конвенция вызова функций, возвращающих объект.

К>Очень может быть, что они уподобляются всяким strcpy: указатель на буфер на входе, указатель на тот же буфер на выходе.

GNU C++
обьект возращаеться через EAX

А>>в теле кода где используеться эта функция, сразу же после использования ее разворачиваеться код деструктора B класса


К>Значит, временный объект не понадобился — и тут же разрушен.


временный обьект был нужен
вот пример использование sub_8

D::somefunc()
{

B tmp2;// стековая переменная

sub_8(tmp2, m_tmp1); // m_tmp1 это обьект A член класса D

// думаю очень похоже на оператор и тогда
//вместо sub_8(tmp2, m_tmp1); было бы tmp2 << m_tmp1;

printf("%s\n", tmp2.GetStr());

tmp2.~B();
}

это то, что можно понять при дизассемблировании

А>>помогите идентифицировать функции, и если можно пример ее использования


К>Варианты сигнатур

К>
К>class B { ..... };

К>class A {

К> .....
К> static B sub8_v1(A* otherA) { return cond ? B(xxxxx) : B(yyyyy); }
К> B sub8_v2(/*this*/) { return cond ? B(xxxxx) : B(yyyyy); }
К> // для извращенцев
К> static B* sub8_v3(char* raw, A* otherA) { return cond ? new(raw)B(xxxxx) : new(raw)B(yyyyy); }
К> .....
К>};

замысловато, но тоже сильно накручено
поскольку там нет ни одного оператора new

К>void use()

К>{
К> A a;

К> A::sub8_v1(&a);


К> a.sub8_v2();


К> // для извращенцев

К> union {
К> char raw[sizeof(B)];
К> double ensure_best_alignment;
К> } buffer;
К> A::sub8_v3(buffer.raw, &a).~B();
К>}
К>

врядли это выглядело так в оригинале ))))))
я привел пример выше как это используеться

К>Ещё есть подозрения на виртуальное наследование A от B. Тогда sub8 — это, возможно, конструктор: он там довольно хитро устроен.


нет, виртуального наследование точно нет

я все более полагаюсь на то что это какойто оператор<<
но констуркторы в теле меня очень смущают
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.