рдпрд╣ рд▓реЗрдЦ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдкрдбрд╝рддрд╛рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ c ++ рдореЗрдВ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдорд╛рди рдХреЗ рд╕рд╛рде рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд┐рдирд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдЦ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдФрд░ рдордиреЛрд░рдВрдЬрдХ рд╣реИредрд░реЗрдХ рдкрд░ рдорд╕реНрддреА рдХрд░рдирд╛ рдХрд┐рд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ - рд╣рдо рдкрд╛рд╕ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рд╣рдо рд░реБрдХрддреЗ рдирд╣реАрдВ рд╣реИрдВредрдкрд░рд┐рдЪрдп
рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕реА ++ рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПредрддрдерд╛рдкрд┐:- рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрднрд╡ рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдХрд╛рд░рдг рдкрд░реНрдпрд╛рдкреНрдд рдЦрддрд░рдирд╛рдХ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ;
- рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд░реЗрдЦрд╛ рдХрд╣рд╛рдВ рд╣реИ
рдЪрд▓реЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ - рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдХреЛрдИ рд╡рд╛рдкрд╕реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИредрдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рдореЛрдб рдореЗрдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВредрд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдЕрдиреБрд╕рдВрдзрд╛рди рд╕рдВрдХрд▓рдХ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдореИрдХ рдПрдХреНрд╕ рдкрд░ рдЕрдиреБрд╕рдВрдзрд╛рди - рд╕реАрдзреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░редрд╕рднреА рдмрд┐рд▓реНрдб x86-x64 рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрд╕рдВрдХрд▓рдХ рдЪреЗрддрд╛рд╡рдиреА / рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рджрдмрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрд╛рдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдмрд╣реБрдд рд╕рд╛рд░реЗ рдбрд┐рд╕реЗрдмрд▓реНрдб рдХреЛрдб рд╣реЛрдВрдЧреЗред рдЗрд╕рдХрд╛ рдбрд┐рдЬрд╛рдЗрди, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдореЛрдЯрд▓реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдареАрдХ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдореИрдВ рд╣рд░ рдЬрдЧрд╣ рдЗрдВрдЯреЗрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛)ред рдореИрдВ рдЕрд╕рдВрддреБрд╖реНрдЯ рдХреЛрдб рдкрд░ рдордзреНрдпрдо рд╡рд┐рд╕реНрддреГрдд рдЯрд┐рдкреНрдкрдгреА рджреВрдВрдЧрд╛, рдЬреЛ рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдЬреНрдЮрд╛рди рдФрд░ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИредрдорд╛рдирдХ рдкрдврд╝реЗрдВ
C ++ 11 рдЕрдВрддрд┐рдо рдбреНрд░рд╛рдлреНрдЯ n3797, C ++ 14 рдЕрдВрддрд┐рдо рдбреНрд░рд╛рдлреНрдЯ N3936:6.6.3 рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ
...
рдХрд┐рд╕реА рдлрдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдлреНрд▓реЛ рдХрд░рдирд╛ рдмрд┐рдирд╛ рдореВрд▓реНрдп рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ; рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк
рдорд╛рди-рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред
...
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ; рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
рд╕реА ++ 17 рдбреНрд░рд╛рдлреНрдЯ n47139.6.3 рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ
...
рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ, рдпрд╛ cv рд╢реВрдиреНрдп рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдлрд╝реНрд▓реЛ рдХрд░рдирд╛ рдмрд┐рдирд╛ рдСрдкрд░реЗрдВрдб рд╡рд╛рд▓реЗ рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЕрдиреНрдпрдерд╛, рдореБрдЦреНрдп (6.8.3.1) рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдмрд╣рдиреЗ рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред
...
рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛, рд╡рд┐рдзреНрд╡рдВрд╕рдХ, рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рд╢реВрдиреНрдп рд░рд┐рдЯрд░реНрди рдорд╛рди (рд╕рдВрднрд╡рдд: рдХреЙрдиреНрд╕реНрдЯ рдФрд░ рд╡рд╛рд╖реНрдкрд╢реАрд▓ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдХреЗ рд╕рд╛рде) рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рдкрд╕реА рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ (рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рдЫреЛрдбрд╝рдХрд░)ред
рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:- рдЗрд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЙрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
- рдЕрдиреНрдпрдерд╛, рдЕрд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░;
- рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрд╕ рдХреНрд╖рдг рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдХреНрд╖рдг рд╕реЗ рдирд╣реАрдВ рдЬрдм рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рдХреНрд╖рдг рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдареАрдХ рд╕реЗ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ;
- рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рд╣реА рдФрд░ рдЧрд▓рдд рдирд┐рд╖реНрдкрд╛рджрди рдкрде рджреЛрдиреЛрдВ рд╣реИрдВ - рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗрд╡рд▓ рдЧрд▓рдд рд░рд╛рд╕реНрддреЛрдВ рдкрд░ рд╣реЛрдЧрд╛;
- рдкреНрд░рд╢реНрди рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рдХреНрдпрд╛рдВрд╢ c ++ 17 рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдирд╣реАрдВ рд╣реИ - рдорд╛рдирдХ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдЦрдВрдб 3.6.1 рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдЕрдкрд╡рд╛рдж рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛редрдЙрджрд╛рд╣рд░рдг 1 - рдмреВрд▓
рд╕реА ++ рдореЗрдВ рдмреВрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рд░рд╛рдЬреНрдп рдХрд╛ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЙрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ#include <iostream>
bool bad() {};
int main()
{
std::cout << bad();
return 0;
}
MSVC рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП C4716 рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП MSVC рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдкрде рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛:#include <iostream>
#include <stdlib.h>
bool bad()
{
if (rand() == 0) {
return true;
}
}
int main()
{
std::cout << bad();
return 0;
}
рд╕рдВрдХрд▓рди:рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:рдЗрд╕ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рднреА, рдЪрд╛рд░ рд╕рдВрдХрд▓рдХреЛрдВ рдиреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рддреАрди рддрд░реАрдХреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рд╣реИредрдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдпреЗ рд╕рдВрдХрд▓рдХ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╕рдВрдХрд▓рд┐рдд рд╣реИрдВредрд▓рд┐рдирдХреНрд╕ x86-x64 рдХреНрд▓реИрдВрдЧ 10.0.0, -O0
рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдВрддрд┐рдо рдХрдерди ud2 рд╣реИ ред рдЗрдВрдЯреЗрд▓ 64 рдФрд░ IA-32 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдореИрдиреБрдЕрд▓рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг :UD2тАФUndefined Instruction
Generates an invalid opcode exception. This instruction is provided for software testing to explicitly generate an invalid opcode exception. The opcode for this instruction is reserved for this purpose.
Other than raising the invalid opcode exception, this instruction has no effect on processor state or memory.
Even though it is the execution of the UD2 instruction that causes the invalid opcode exception, the instruction pointer saved by delivery of the exception references the UD2 instruction (and not the following instruction).
This instructionтАЩs operation is the same in non-64-bit modes and 64-bit mode.
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрджреЗрд╢ рд╣реИредрдЖрдкрдХреЛ рдПрдХ рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдЦрд░рд╛рдм () рдХреЙрд▓ рдХреЛ рдкрдХрдбрд╝рдиреЗ ... рдкрдХрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! рдмреНрд▓реЙрдХ!рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рдХреИрд╕реЗред рдпрд╣ c ++ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИредрдХреНрдпрд╛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ ud2 рдХреЛ рдкрдХрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ?рд╡рд┐рдВрдбреЛрдЬ рдкрд░, __try рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, Linux рдФрд░ macOs X рдкрд░, SIGILL рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░редрд▓рд┐рдирдХреНрд╕ x86-x64 рдХреНрд▓реИрдВрдЧ 10.0.0, -O1, -O2
рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЗрд╕рдХреЗ рдХреЙрд▓ рдХреЗ рджреЛрдиреЛрдВ рд╢рд░реАрд░ рдХреЛ рдирд┐рдХрд╛рд▓ рд▓рд┐рдпрд╛ рдФрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛редрд▓рд┐рдирдХреНрд╕ x86-x64 gcc 9.3, -O0
рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг (рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ, рдЪреВрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдЕрдВрдд рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ):5. рдмреВрд▓ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рд▓рд╛рдЗрди 14);4. рдкрддрд╛ std :: cout рдХреЛ edi register рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рд╕реНрдЯреНрд░реАрдо (рд▓рд╛рдЗрди 13) рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╣реИ;3. рдИрдЖрд░рдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрд╕рдИрдЖрдИ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдзрд╛рд░рд╛ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╣реИ (рд▓рд╛рдЗрди 12);2. рдИрдЧрд▓ рдХреЗ рддреАрди рдЙрдЪреНрдЪ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд▓ рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ (рдкрдВрдХреНрддрд┐ 11);1. рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкрдВрдХреНрддрд┐ 10);0. рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдПредрдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд▓рд╛рдЗрди 4 рдореЗрдВ рдПрдирдУрдкреА (рдиреЛ рдСрдкрд░реЗрд╢рди, рдбрдореА) рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИредрдЕрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдХрдЪрд░реЗ рдХрд╛ рдПрдХ рдмрд╛рдЗрдЯ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИредрд▓рд┐рдирдХреНрд╕ x86-x64 gcc 9.3, -O1, -O2, -O3
рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдм рдХреБрдЫ рдлреЗрдВрдХ рджрд┐рдпрд╛редmacOs X Apple рдХреНрд▓реИрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг 11.0.0, -O0
рдлрд╝рдВрдХреНрд╢рди рдореБрдЦреНрдп ():
рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмреВрд▓рд┐рдпрди рддрд░реНрдХ рдХрд╛ рдкрде рд╕реНрдЯреНрд░реАрдо рдореЗрдВ (рдЗрд╕ рдмрд╛рд░ рдкреНрд░рддреНрдпрдХреНрд╖ рдХреНрд░рдо рдореЗрдВ):1. рдЕрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ edx рд░рдЬрд┐рд╕реНрдЯрд░ (рдкрдВрдХреНрддрд┐ 8) рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ;2. edx рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рднреА рдмрд┐рдЯреНрд╕ рд╢реВрдиреНрдп рд╣реИрдВ, рд╕рдмрд╕реЗ рдХрдо (рд▓рд╛рдЗрди 9) рдХреЛ рдЫреЛрдбрд╝рдХрд░;3. std рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ :: cout рдХреЛ rdi рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рд╕реНрдЯреНрд░реАрдо (рд▓рд╛рдЗрди 10) рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╣реИ;4. edx рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ esi рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдзрд╛рд░рд╛ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╣реИ (рд▓рд╛рдЗрди 11);5. рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреЗрдЯрдо рдХреЛ рдмреВрд▓ (рд▓рд╛рдЗрди 13) рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ;рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЕрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИредрдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди:
1. рд╕реНрдЯреИрдХ рдХреЗ рдЕрдЧрд▓реЗ рдмрд╛рдЗрдЯ рд╕реЗ рдореВрд▓реНрдп, рдЕрднреА рддрдХ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ (рдкрдВрдХреНрддрд┐ 4) рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ;2. рдЕрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рднреА рдмрд┐рдЯреНрд╕ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг (рдкрдВрдХреНрддрд┐ 5) рдХреЛ рдЫреЛрдбрд╝рдХрд░;рдЕрдирд▓реЙрдХреНрдб рд╕реНрдЯреИрдХ рд╕реЗ рдПрдХ рдмрд┐рдЯ рдХрдЪрд░рд╛ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдПрдХ рдЯреЗрд╕реНрдЯ рд░рди рдХреЗ рджреМрд░рд╛рди рдпрд╣ рд╢реВрдиреНрдп рд╣реЛ рдЧрдпрд╛редрдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИредmacOs X Apple рдХреНрд▓реИрдВрдЧ рд╡рд░реНрдЬрди 11.0.0, -O1, -O2
рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдмреВрд▓рд┐рдпрди рддрд░реНрдХ рд╢реВрдиреНрдп рд╣реИ (рдкрдВрдХреНрддрд┐ 5)редрдЕрдиреБрдХреВрд▓рди рдХреЗ рджреМрд░рд╛рди рдЦрд░рд╛рдм () рдХреЙрд▓ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛редрдХрд╛рд░реНрдпрдХреНрд░рдо рд╣рдореЗрд╢рд╛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╢реВрдиреНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИредрд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, рдЙрдиреНрдирдд рдЙрджрд╛рд╣рд░рдг, / Od
рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП edx рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИредрдЕрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдХрдЪрд░рд╛ рдХрд╛ рдПрдХ рдмрд╛рдЗрдЯ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд╣реИ (рдпрджрд┐ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдареАрдХ рд╣реИ, рддреЛ рд░реИрдВрдб () рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдХрдо рдмрд╛рдЗрдЯ)ред рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИредрд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4 рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг, / O1, / O2
рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдЦрд░рд╛рдм () рдХреЙрд▓ рдХреЛ рдЬрдмрд░рди рдЭреБрдХрд╛ рджрд┐рдпрд╛ред рдореБрдЦреНрдп рдХрд╛рд░реНрдп:- [rsp + 30h] рдкрд░ рд╕реНрдерд┐рдд рд╕реНрдореГрддрд┐ рд╕реЗ рдИрдмреЗрдХреНрд╕ рд╕реЗ рдПрдХ рдмрд╛рдЗрдЯ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ;
- рдЕрдЧрд░ рд░реИрдВрдб () рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдЖрдпрд╛, рддреЛ рдИрдПрдХреНрд╕рдПрдХреНрд╕ рд╕реЗ рдИрдмреЗрдХреНрд╕ (рдкрдВрдХреНрддрд┐ 11) рддрдХ рдпреВрдирд┐рдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ;
- рдЙрд╕реА рдорд╛рди рдХреЛ dl рдкрд░ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдЗрдЯ) (рдкрдВрдХреНрддрд┐ 13);
- рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ dl рд╡реИрд▓реНрдпреВ (рд▓рд╛рдЗрди 14) рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред
рд░реИрдо рд╕реЗ рдХрдЪрд░рд╛ рдХрд╛ рдПрдХ рдмрд╛рдЗрдЯ (рдкрддрд╛ рдЖрд░рдкреА + 30 рдПрдЪ рд╕реЗ) рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИредрдЙрджрд╛рд╣рд░рдг 1 рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖
Disassembler рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВ:рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдиреЗ 3 рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдП, рд▓реЗрдХрд┐рди рдЕрд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ 6 рд╡реЗрд░рд┐рдПрдВрдЯ - рдЕрд╕рдВрддреБрд╖реНрдЯ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ, рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗредрдЙрджрд╛рд╣рд░рдг 1 рдП - рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди
рдЖрдЗрдП рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ - рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВредрдпрд╣ рдХреЗрд╡рд▓ рдЙрди рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрдЪрд░рд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВредрдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╛рдВрдЫрд┐рдд рдорд╛рдиреЛрдВ рдХреЛ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╣рдереЗрд▓реА рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ рдЬрд╣рд╛рдВ рд╕реЗ рд╕рдВрдХрд▓рдХ рдЙрдиреНрд╣реЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛редрд▓рд┐рдирдХреНрд╕ x86-x64 gcc 9.3, -O0
рдЦрд╛рд▓реА рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рд░рдЬрд┐рд╕реНрдЯрд░ рдЕрд▓ рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╣рдо рдЦрд░рд╛рдм рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрд▓ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рд░рдЦрддреЗ рд╣реИрдВ (), рддреЛ рд╣рдо рдЙрд╕ рдореВрд▓реНрдп рдХреЛ рдЦрд░рд╛рдм () рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВредрдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдмреВрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХрд╕рд┐рдВрдЧ рдЪрд╛рд░редрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб#include <iostream>
bool bad() {}
bool goodTrue()
{
return rand();
}
bool goodFalse()
{
return !goodTrue();
}
unsigned char goodChar(unsigned char ch)
{
return ch;
}
int main()
{
goodTrue();
std::cout << bad() << std::endl;
goodChar(85);
std::cout << bad() << std::endl;
goodFalse();
std::cout << bad() << std::endl;
goodChar(240);
std::cout << bad() << std::endl;
return 0;
}
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ:рез
0рел
реж
реирекреж
рд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, / Od
MSVC рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рд░реИрдВрдб () рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдХрдо рдмрд╛рдЗрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИредрдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, рдмрд╛рд╣рд░реА рдХреЛрдб рд░реИрдВрдб () рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИредрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб#include <iostream>
#include <stdlib.h>
void control(unsigned char value)
{
uint32_t count = 0;
srand(0);
while ((rand() & 0xff) != value) {
++count;
}
srand(0);
for (uint32_t i = 0; i < count; ++i) {
rand();
}
}
bool bad()
{
if (rand() == 0) {
return true;
}
}
int main()
{
control(1);
std::cout << bad() << std::endl;
control(85);
std::cout << bad() << std::endl;
control(0);
std::cout << bad() << std::endl;
control(240);
std::cout << bad() << std::endl;
return 0;
}
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ:рез
0рел
реж
реирекреж
рд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, / O1, / O2
рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ "рд▓реМрдЯрд╛рдП рдЧрдП" рдорд╛рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕реНрдЯреИрдХ рдЪрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рддрд╛рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреМрд░рд╛рди рдЗрд╕рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдмрд╛рд╣рд░ рди рдлреЗрдВрдХреЗ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб#include <iostream>
#include <stdlib.h>
bool bad()
{
if (rand() == 0) {
return true;
}
}
int main()
{
volatile unsigned char ch = 1;
std::cout << bad() << std::endl;
ch = 85;
std::cout << bad() << std::endl;
ch = 0;
std::cout << bad() << std::endl;
ch = 240;
std::cout << bad() << std::endl;
return 0;
}
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ:рез
0рел
реж
реирекреж
macOs X Apple рдХреНрд▓реИрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг 11.0.0, -O0
рдЦрд░рд╛рдм () рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрд╕ рдореЗрдореЛрд░реА рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐ рдХреЙрд▓рд┐рдВрдЧ рдЦрд░рд╛рдм рд╣реЛрдиреЗ рдХреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рд╕реЗ рдПрдХ рдХрдо рд╣реЛрдЧрд╛ ()редрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб#include <iostream>
bool bad() {}
void putToStack(uint8_t value)
{
uint8_t memory[1]{value};
}
int main()
{
putToStack(20);
std::cout << bad() << std::endl;
putToStack(55);
std::cout << bad() << std::endl;
putToStack(0xfe);
std::cout << bad() << std::endl;
putToStack(11);
std::cout << bad() << std::endl;
return 0;
}
-O0, memory. , .
memory , тАФ , , .
, .. , тАФ putToStack .
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ:реж
рез
реж
рез
рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдХрдо-рдСрд░реНрдбрд░ рдмрд┐рдЯ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИредрдЙрджрд╛рд╣рд░рдг 1a рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдиреЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреА рд╕рд╣реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛редрдЙрджрд╛рд╣рд░рдг 1 рдмреА - рдЯреВрдЯреА рд╣реБрдИ рдмреВрд▓
рдареАрдХ рд╣реИ, рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, "41" рдХреЛ "1" рдХреЗ рдмрдЬрд╛рдп рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ... рдХреНрдпрд╛ рдпрд╣ рдЦрддрд░рдирд╛рдХ рд╣реИ?рд╣рдо рджреЛ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрдЪрд░реЗ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдмрд╛рдЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВредрд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, / Od
рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб#include <iostream>
#include <stdlib.h>
#include <set>
#include <unordered_set>
bool bad()
{
if (rand() == 0) {
return true;
}
}
int main()
{
bool badBool1 = bad();
bool badBool2 = bad();
std::cout << "badBool1: " << badBool1 << std::endl;
std::cout << "badBool2: " << badBool2 << std::endl;
if (badBool1) {
std::cout << "if (badBool1): true" << std::endl;
} else {
std::cout << "if (badBool1): false" << std::endl;
}
if (!badBool1) {
std::cout << "if (!badBool1): true" << std::endl;
} else {
std::cout << "if (!badBool1): false" << std::endl;
}
std::cout << "(badBool1 == true || badBool1 == false || badBool1 == badBool2): "
<< std::boolalpha << (badBool1 == true || badBool1 == false || badBool1 == badBool2)
<< std::endl;
std::cout << "std::set<bool>{badBool1, badBool2, true, false}.size(): "
<< std::set<bool>{badBool1, badBool2, true, false}.size()
<< std::endl;
std::cout << "std::unordered_set<bool>{badBool1, badBool2, true, false}.size(): "
<< std::unordered_set<bool>{badBool1, badBool2, true, false}.size()
<< std::endl;
return 0;
}
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ:badBool1: 41
badBool2: 35
if (badBool1): true
if (badBool1): рдорд┐рдереНрдпрд╛
(badBool1 == true || badBool1 == false || badBool1 == badBool1): false
std :: set <bool> {badBool1 || badBool2 , рд╕рдЪреНрдЪрд╛, рдЧрд▓рдд} .рд╕рд╛рдЗрдЬрд╝ (): 4
std :: unordered_set <bool> {badBool1, badBool2, true, false} (.size): 4
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдХрдо рд╕реЗ рдХрдо рдЯреВрдЯрдиреЗ рд╡рд╛рд▓реЗ рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИ:- рдмреВрд▓рд┐рдпрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ;
- рдмреВрд▓рд┐рдпрди рдореВрд▓реНрдп рдХрд╛ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рдиред
рд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, / O1, / O2
рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб#include <iostream>
#include <stdlib.h>
#include <set>
#include <unordered_set>
bool bad()
{
if (rand() == 0) {
return true;
}
}
int main()
{
volatile unsigned char ch = 213;
bool badBool1 = bad();
ch = 137;
bool badBool2 = bad();
std::cout << "badBool1: " << badBool1 << std::endl;
std::cout << "badBool2: " << badBool2 << std::endl;
if (badBool1) {
std::cout << "if (badBool1): true" << std::endl;
}
else {
std::cout << "if (badBool1): false" << std::endl;
}
if (!badBool1) {
std::cout << "if (!badBool1): true" << std::endl;
}
else {
std::cout << "if (!badBool1): false" << std::endl;
}
std::cout << "(badBool1 == true || badBool1 == false || badBool1 == badBool2): "
<< std::boolalpha << (badBool1 == true || badBool1 == false || badBool1 == badBool2)
<< std::endl;
std::cout << "std::set<bool>{badBool1, badBool2, true, false}.size(): "
<< std::set<bool>{badBool1, badBool2, true, false}.size()
<< std::endl;
std::cout << "std::unordered_set<bool>{badBool1, badBool2, true, false}.size(): "
<< std::unordered_set<bool>{badBool1, badBool2, true, false}.size()
<< std::endl;
return 0;
}
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ:badBool1: 213
badBool2: 137
if (badBool1): true
if ((badBool1): false
(badBool1 == true || badBool1 == false || badBool1 == badBool1): false
std :: set <bool> {badBool2 || badBool2 , рд╕рд╣реА, рдЧрд▓рдд} .рд╕рд╛рдЗрдЬрд╝ (): 4
std :: unordered_set <bool> {badBool1, badBool2, true, false} (.size): 4
рдЕрдиреБрдХреВрд▓рди рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рджреВрд╖рд┐рдд рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдмрджрд▓рд╛редрд▓рд┐рдирдХреНрд╕ x86-x64 gcc 9.3, -O0
рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб#include <iostream>
#include <stdlib.h>
#include <set>
#include <unordered_set>
bool bad()
{
}
unsigned char goodChar(unsigned char ch)
{
return ch;
}
int main()
{
goodChar(213);
bool badBool1 = bad();
goodChar(137);
bool badBool2 = bad();
std::cout << "badBool1: " << badBool1 << std::endl;
std::cout << "badBool2: " << badBool2 << std::endl;
if (badBool1) {
std::cout << "if (badBool1): true" << std::endl;
}
else {
std::cout << "if (badBool1): false" << std::endl;
}
if (!badBool1) {
std::cout << "if (!badBool1): true" << std::endl;
}
else {
std::cout << "if (!badBool1): false" << std::endl;
}
std::cout << "(badBool1 == true || badBool1 == false || badBool1 == badBool2): "
<< std::boolalpha << (badBool1 == true || badBool1 == false || badBool1 == badBool2)
<< std::endl;
std::cout << "std::set<bool>{badBool1, badBool2, true, false}.size(): "
<< std::set<bool>{badBool1, badBool2, true, false}.size()
<< std::endl;
std::cout << "std::unordered_set<bool>{badBool1, badBool2, true, false}.size(): "
<< std::unordered_set<bool>{badBool1, badBool2, true, false}.size()
<< std::endl;
return 0;
}
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ:badBool1: 213
badBool2: 137
if (badBool1): true
if ((badBool1): true
(badBool1 == true || badBool1 == false || badBool1 == badBool1): false
std :: set <bool> {badBool2 || badBool2 , рд╕рд╣реА, рдЧрд▓рдд} .рд╕рд╛рдЗрдЬрд╝ (): 4
std :: unordered_set <bool> {badBool1, badBool2, true, false} (.size): 4
MSVC рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, gcc рдиреЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЧрд▓рдд рд╕рдВрдЪрд╛рд▓рди рдХреЛ рднреА рдЬреЛрдбрд╝рд╛редрдЙрджрд╛рд╣рд░рдг 1 рдмреА рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖
рдмреВрд▓рд┐рдпрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╡рд┐рдШрдЯрди рдХреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЧрдВрднреАрд░ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВредрдпрд╣ рдХреНрдпреЛрдВ рд╣реБрдЖ?рдХреНрдпреЛрдВрдХрд┐ рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рддрд╣рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдЪ рдХрдбрд╝рд╛рдИ рд╕реЗ рдПрдХ рдЗрдХрд╛рдИ рд╣реИредрд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрд╕рд╣рдорддрд┐ рдореЗрдВ рдирд╣реАрдВ рдорд╛рдиреЗрдВрдЧреЗ - рдпрд╣ рд▓реЗрдЦ рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рдирд┐рдХрд▓рд╛редрдПрдХ рдмрд╛рд░ рдлрд┐рд░, рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ:рдЪрд╛рд░ рд╕рдВрдХрд▓рдХ рдиреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ 7 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рджреАрдВредрдЙрджрд╛рд╣рд░рдг 2 - рд╕рдВрд░рдЪрдирд╛
рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реИрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓:#include <iostream>
#include <stdlib.h>
struct Test
{
Test(uint64_t v)
: value(v)
{
std::cout << "Test::Test(" << v << ")" << std::endl;
}
~Test()
{
std::cout << "Test::~Test()" << std::endl;
}
uint64_t value;
};
Test bad(int v)
{
if (v == 0) {
return {42};
} else if (v == 1) {
return {142};
}
}
int main()
{
const auto rnd = rand();
std::cout << "rnd: " << rnd << std::endl;
std::cout << bad(rnd).value << std::endl;
return 0;
}
рдЯреЗрд╕реНрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП int рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрд╕рдВрджреЗрд╢ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЦрд░рд╛рдм (рдЗрдВрдЯ) рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджреЛ рдорд╛рдиреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдкрде рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдПрдХ рдХреЙрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдЗрд╕ рдмрд╛рд░ - рдкрд╣рд▓реЗ рддрд╛рд▓рд┐рдХрд╛, рдлрд┐рд░ рдЕрд╕реНрдкрд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЕрд╕рд╣рдорддрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдгредрдлрд┐рд░ рд╕реЗ рд╣рдо рдХрдИ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦрддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд ud2 рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдо рд╕реЗ рдХрдо 4 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИрдВредрдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рдХ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ:- рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдмреБрд▓рд╛рдП рдмрд┐рдирд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рд╣рд╛ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╕реНрддреБ рдХреБрдЫ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдереА;
- рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдкрде рдкрд░ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЕрдЬреАрдм рд╣реИред
рд▓рд┐рдирдХреНрд╕ x86-x64 рдХреНрд▓реИрдВрдЧ 10.0.0, -O1, -O2
рдХреЛрдб (рд▓рд╛рдЗрди 14) рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╢рд░реНрдд рдХреВрдж (рд▓рд╛рдЗрди 15) рд╣реИред рд╕рдВрдХрд▓рдХ рдиреЗ рджреВрд╕рд░реА рддреБрд▓рдирд╛ рдФрд░ рджреВрд╕рд░реА рд╕рд╢рд░реНрдд рдХреВрдж рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛редрдпрд╣ рдЗрд╕ рд╕рдВрджреЗрд╣ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдорд╛рдирдХ рдорд╛рдирдХ рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рд╣реБрдЖ рдерд╛редрд▓реЗрдХрд┐рди рдпрджрд┐ рдХреЛрдИ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдФрд░ рд╕рдВрдХрд▓рдХ рддрд░реНрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:- рдЕрдЧрд░ рджреВрд╕рд░реА рд╢рд░реНрдд рд╕рд╣реА рд╣реИ - рдЖрдкрдХреЛ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЯреЗрд╕реНрдЯ рдХреЛ 142 рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛;
- рдпрджрд┐ рджреВрд╕рд░реА рд╢рд░реНрдд рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдмрд┐рдирд╛ рдорд╛рди рд▓реМрдЯрд╛рдП рдмрд┐рдирд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рд╣рд┐рдд - рдПрдХ рд╣реА рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдмреБрд▓рд╛рдУ;
- рд╕рддреНрдпрд╛рдкрди рдЕрддрд┐рд╢реНрдпреЛрдХреНрддрд┐рдкреВрд░реНрдг рд╣реИ, рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЯреЗрд╕реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ 142 рдХреЛ рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рджреВрд╕рд░реЗ рдЪреЗрдХ рдореЗрдВ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИ:Test bad(int v)
{
if (v == 0) {
return {42};
} else if (v == rand()) {
return {142};
}
}
рдкреВрд░реНрдг рдХреЛрдб#include <iostream>
#include <stdlib.h>
struct Test
{
Test(uint64_t v)
: value(v)
{
std::cout << "Test::Test(" << v << ")" << std::endl;
}
~Test()
{
std::cout << "Test::~Test()" << std::endl;
}
uint64_t value;
};
Test bad(int v)
{
if (v == 0) {
return {42};
} else if (v == rand()) {
return {142};
}
}
int main()
{
const auto rnd = rand();
std::cout << "rnd: " << rnd << std::endl;
std::cout << bad(rnd).value << std::endl;
return 0;
}
рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рд░реИрдВрдб () (рд▓рд╛рдЗрди 16) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рднреА рдЗрдЪреНрдЫрд┐рдд рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдиреБрдЪрд┐рдд рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╣ рджреВрд░ рд╣реЛ рдЧрдпрд╛редрд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, / Od / RTCs
/ RTCs рд╡рд┐рдХрд▓реНрдк рд╕реНрдЯреИрдХ рдлрд╝реНрд░реЗрдо рд░рди-рдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рдбрд┐рдмрдЧ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдореБрдЦреНрдп () рдЦрдВрдб рдХреЗ рдЕрд╕рдВрддреБрд╖реНрдЯ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдЦрд░рд╛рдм (int) (рдкрдВрдХреНрддрд┐ 4) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рддрд░реНрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - rnd рдЪрд░ рдХрд╛ рдорд╛рди edx рд░рдЬрд┐рд╕реНрдЯрд░ (рдкрдВрдХреНрддрд┐ 2) рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрддреЗ рдкрд░ рд╕реНрдерд┐рдд рдХреБрдЫ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдкрддрд╛ rcx рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЖрд░рдПрд╕рдкреА + 28 рдПрдЪ (рдкрдВрдХреНрддрд┐ 3)редрд╕рдВрднрд╡рддрдГ, rsp + 28 рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХрд╛ рдкрддрд╛ рд╣реИ рдЬреЛ рдХреЙрд▓рд┐рдВрдЧ рдЦрд░рд╛рдм (int) рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИредрдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рд▓рд╛рдЗрдиреЛрдВ 19 рдФрд░ 20 рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ - рдПрдХ рд╣реА рдЪрд░ рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдкрддрд╛ рдЖрд░рд╕реАрдПрдХреНрд╕ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИредрд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рд╛рдЗрдиреЛрдВ 4 - 18 рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ, рдЗрд╕ рдЪрд░ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╛рд╡рдЬреВрдж рдЗрд╕рдХреЗ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рди рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдмрд╛рд╡рдЬреВрджредрдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ MSVC рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рд╕реЗ рджреЗрдЦрд╛ рдерд╛, rdx рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред Rdx рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ rax (рдкрдВрдХреНрддрд┐ 9) рдореЗрдВ рд╕реНрдерд┐рдд рдкрддреЗ рдХреЛ рдбреАрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИредрдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдЦрд░рд╛рдм (int) рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ:- рдПрдХ рдЪрд░ рдореЗрдВ рднрд░рдирд╛ рдЬрд┐рд╕рдХрд╛ рдкрддрд╛ рдЖрд░рд╕реАрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рд╣рдо рдЖрд░рд╡реАрдУ рдХреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ);
- rax рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдЪрд░ рдХрд╛ рдкрддрд╛ рд▓реМрдЯрд╛рдирд╛ред
рдЖрдЗрдП рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдЦрд░рд╛рдм (int) рдкрд░ рдЬрд╛рдПрдВ:
- рдИрдПрдХреНрд╕рдПрдХреНрд╕ рдореЗрдВ, рдорд╛рди 0xCCCCCCCC рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдПрдХреНрд╕реЗрд╕ рдЙрд▓реНрд▓рдВрдШрди рд╕рдВрджреЗрд╢ (рд▓рд╛рдЗрди 9) рдореЗрдВ рджреЗрдЦрд╛ рдерд╛ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЗрд╡рд▓ 4 рдмрд╛рдЗрдЯреНрд╕, рдЬрдмрдХрд┐ рдПрдХреНрд╕реЗрд╕рд╡рд┐рд▓реЗрд╢рди рд╕рдВрджреЗрд╢ рдореЗрдВ рдкрддрд╛ 8 рдмрд╛рдЗрдЯреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ);
- рд░реЗрдк рд╕реНрдЯреЛрд╕ рдХрдорд╛рдВрдб рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрддрд╛ рд░реЗрджреА (рд▓рд╛рдЗрди 10) рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдХреЛ рдИрдПрдХреНрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рд▓рд┐рдЦрдиреЗ рдХреЗ 0xC рдЪрдХреНрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ред рдпреЗ 48 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ - рд▓рд╛рдЗрди 6 рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдЬрд┐рддрдирд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рд╕рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдкрдереЛрдВ рдкрд░, rsp + 40h рд╕реЗ рдорд╛рди rax рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд▓рд╛рдЗрдиреЗрдВ 23, 36);
- рдЖрд░рд╕реАрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ (рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЦреНрдп () рдЧрдВрддрд╡реНрдп рдкрддреЗ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рдореВрд▓реНрдп рдХреЛ rsp + 8 (рд▓рд╛рдЗрди) рдкрд░ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рд╕реНрдЯреИрдХ рдкрд░ рд░рдбреА рдХреЛ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ 8 (рдкрдВрдХреНрддрд┐ 5) рд╕реЗ рдЖрд░рдПрд╕рдкреА рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ;
- 30 h рдмрд╛рдЗрдЯреНрд╕ рдХреЛ rsp (рдкрдВрдХреНрддрд┐ 6) рдХреЛ рдШрдЯрд╛рдХрд░ рд╕реНрдЯреИрдХ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рдкрдВрдХреНрддрд┐ 4 рдореЗрдВ rsp + 8 рдФрд░ рдмрд╛рдХреА рдХреЛрдб рдореЗрдВ rsp + 40h рд╕рдорд╛рди рдорд╛рди рд╣реИрдВредрдХреЛрдб рдмрд▓реНрдХрд┐ рднреНрд░рд╛рдордХ рд╣реИ рдпрд╣ рдЖрд░рдмреАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИредрдПрдХреНрд╕реЗрд╕ рдЙрд▓реНрд▓рдВрдШрди рд╕рдВрджреЗрд╢ рдореЗрдВ рджреЛ рджреБрд░реНрдШрдЯрдирд╛рдПрдБ рд╣реИрдВ:- рдкрддреЗ рдХреЗ рдКрдкрд░реА рднрд╛рдЧ рдореЗрдВ рд╢реВрдиреНрдп - рдХреЛрдИ рднреА рдХрдЪрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ;
- рдкрддрд╛ рдЧрд▓рддреА рд╕реЗ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ред
рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, / RTCs рд╡рд┐рдХрд▓реНрдк рдиреЗ рдХреБрдЫ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХ рдУрд╡рд░рд░рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛, рдФрд░ рдПрдХреНрд╕реЗрд╕ рдЙрд▓реНрд▓рдВрдШрди рд╕рдВрджреЗрд╢ рдХреЗрд╡рд▓ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рднрд╛рд╡ рдерд╛редрдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ / RTCs рд╡рд┐рдХрд▓реНрдк рд╡рд╛рд▓рд╛ рдХреЛрдб рдмрд┐рдирд╛ рдХреЛрдб рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреИрд╕реЗ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИред
рд╕реНрдЯреИрдХ рдкрд░ рдореБрдЦреНрдп () рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдкрддреЗ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред
(рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЦрд░рд╛рдм (int) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рдЖрдЧреЗ рд░рдЦрд╛ - / RTCs рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛)/ RTCs рдХреЗ рдмрд┐рдирд╛, rep stos рдирд┐рд░реНрджреЗрд╢ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИредрдЙрджрд╛рд╣рд░рдг 2 рдП
рдлрд┐рд░, рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЗрд╕ рдмрд╛рд░ рд╕рд┐рд░реНрдл рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдПредрд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, / Od / RTCs
/ RTCs рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде, рдХрдВрдкрд╛рдЗрд▓рд░ рдЦрд░рд╛рдм (int) рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЛрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде rax рдХреЗ рдирд┐рдЪрд▓реЗ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рднрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХреБрдЫ рдорд╛рдиреНрдп рдкрддреЗ рдХреЗ рд╕рд╛рде rax рднрд░реЗрдВредрдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдХреБрдЫ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП std :: cout to the bad (int) рдмреЙрдбреАредрдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб#include <iostream>
#include <stdlib.h>
struct Test
{
Test(uint64_t v)
: value(v)
{
std::cout << "Test::Test(" << v << ")" << std::endl;
}
~Test()
{
std::cout << "Test::~Test()" << std::endl;
}
uint64_t value;
};
Test bad(int v)
{
std::cout << "rnd: " << v << std::endl;
if (v == 0) {
return {42};
} else if (v == 1) {
return {142};
}
}
int main()
{
const auto rnd = rand();
std::cout << bad(rnd).value << std::endl;
return 0;
}
рд░реЗрдВрдб : 41 8791039331928
рдЯреЗрд╕реНрдЯ :: ~ рдЯреЗрд╕реНрдЯ ()
рдСрдкрд░реЗрдЯрд░ << рдПрдХ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдбреНрд░реЗрд╕ std :: cout in rax рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрддрд╛ рд╕рд╣реА рд╣реИ, рдЗрд╕реЗ рдбреАрд░реЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣реБрдВрдЪ рдЙрд▓реНрд▓рдВрдШрди рд░реЛрдХрд╛ рдЬрд╛рддрд╛ рд╣реИредрдирд┐рд╖реНрдХрд░реНрд╖
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ:- рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ 10 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ;
- рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдиреЗрдВред
рд╕рднреА рд╕рдВрдХрд▓рдХ рдиреЗ рдорд╛рдирдХ рдХрд╛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд╛рд▓рди рдХрд┐рдпрд╛ - рдХрд┐рд╕реА рднреА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖред рд▓реЗрдХрд┐рди рдЖрдк рдбреЗрд╡рд▓рдкрд░реЛрдВ рдХреЛ рдлрдВрддрд╛рд╕реА рд╕реЗ рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗредрдЕрдХреНрд╕рд░, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реВрдХреНрд╖реНрдо рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ: рдпрд╣ рдХреЛрдб рдХреА рдПрдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реЗрдЦрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛рдлреА рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИредрдЬрд╛рд╣рд┐рд░ рд╣реИ, рдмрд╛рдж рдореЗрдВ рдкрд╣реЗрд▓рд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдРрд╕реЗ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред