рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдПрдХ рдЕрдзреНрдпрдпрди

рдпрд╣ рд▓реЗрдЦ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдкрдбрд╝рддрд╛рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ c ++ рдореЗрдВ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдорд╛рди рдХреЗ рд╕рд╛рде рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд┐рдирд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдЦ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдФрд░ рдордиреЛрд░рдВрдЬрдХ рд╣реИред

рд░реЗрдХ рдкрд░ рдорд╕реНрддреА рдХрд░рдирд╛ рдХрд┐рд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ - рд╣рдо рдкрд╛рд╕ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рд╣рдо рд░реБрдХрддреЗ рдирд╣реАрдВ рд╣реИрдВред

рдкрд░рд┐рдЪрдп


рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕реА ++ рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред
рддрдерд╛рдкрд┐:

  • рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрднрд╡ рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдХрд╛рд░рдг рдкрд░реНрдпрд╛рдкреНрдд рдЦрддрд░рдирд╛рдХ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ;
  • рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд░реЗрдЦрд╛ рдХрд╣рд╛рдВ рд╣реИ

рдЪрд▓реЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ - рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдХреЛрдИ рд╡рд╛рдкрд╕реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рдореЛрдб рдореЗрдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдЕрдиреБрд╕рдВрдзрд╛рди рд╕рдВрдХрд▓рдХ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдореИрдХ рдПрдХреНрд╕ рдкрд░ рдЕрдиреБрд╕рдВрдзрд╛рди - рд╕реАрдзреЗ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ред

рд╕рднреА рдмрд┐рд▓реНрдб x86-x64 рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рдВрдХрд▓рдХ рдЪреЗрддрд╛рд╡рдиреА / рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рджрдмрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрд╛рдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдмрд╣реБрдд рд╕рд╛рд░реЗ рдбрд┐рд╕реЗрдмрд▓реНрдб рдХреЛрдб рд╣реЛрдВрдЧреЗред рдЗрд╕рдХрд╛ рдбрд┐рдЬрд╛рдЗрди, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдореЛрдЯрд▓реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдареАрдХ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдореИрдВ рд╣рд░ рдЬрдЧрд╣ рдЗрдВрдЯреЗрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛)ред рдореИрдВ рдЕрд╕рдВрддреБрд╖реНрдЯ рдХреЛрдб рдкрд░ рдордзреНрдпрдо рд╡рд┐рд╕реНрддреГрдд рдЯрд┐рдкреНрдкрдгреА рджреВрдВрдЧрд╛, рдЬреЛ рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдЬреНрдЮрд╛рди рдФрд░ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдорд╛рдирдХ рдкрдврд╝реЗрдВ


C ++ 11 рдЕрдВрддрд┐рдо рдбреНрд░рд╛рдлреНрдЯ n3797, C ++ 14 рдЕрдВрддрд┐рдо рдбреНрд░рд╛рдлреНрдЯ N3936:
6.6.3 рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ
...
рдХрд┐рд╕реА рдлрдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдлреНрд▓реЛ рдХрд░рдирд╛ рдмрд┐рдирд╛ рдореВрд▓реНрдп рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ; рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк
рдорд╛рди-рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред
...

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдЯрд░реНрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ; рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред

рд╕реА ++ 17 рдбреНрд░рд╛рдлреНрдЯ n4713
9.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рдЪреЗрддрд╛рд╡рдиреА: рдЧреИрд░-рд╢реВрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ [-рд╡рд░реНрдг-рдкреНрд░рдХрд╛рд░]
рд▓рд┐рдирдХреНрд╕x86-x64 gcc 9.3рдЪреЗрддрд╛рд╡рдиреА: рдЧреИрд░-рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ
рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕Apple рдХреНрд▓реИрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг 11.0.0рдЪреЗрддрд╛рд╡рдиреА: рдирд┐рдпрдВрддреНрд░рдг рдЧреИрд░-рд╢реВрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИ [-рд╡рд░реНрдг-рдкреНрд░рдХрд╛рд░]
рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдБMSVC 2019 16.5.4рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рддреНрд░реБрдЯрд┐ C4716 рд╣реИ, рдЬрдЯрд┐рд▓ - рдЪреЗрддрд╛рд╡рдиреА C4715: рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдкрде рдПрдХ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ

рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:
рдЕрдиреБрдХреВрд▓рдирдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд╛рдкрд╕реАрдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ
рд▓рд┐рдирдХреНрд╕ x86-x64 рдХреНрд▓реИрдВрдЧ 10.0.0
-O0255рдЙрддреНрдкрд╛рджрди рдирд╣реА
-рдУ рез, -рдУ реи0рдЙрддреНрдкрд╛рджрди рдирд╣реА
рд▓рд┐рдирдХреНрд╕ x86-x64 gcc 9.3
-O0089
-рдУ 1, -рдУ 2, -рдУ 30рдЙрддреНрдкрд╛рджрди рдирд╣реА
macOs X Apple рдХреНрд▓реИрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг 11.0.0
-рдУ реж, -рдУ рез, -рдУ реи00
рд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, рдореВрд▓ рдЙрджрд╛рд╣рд░рдг
/ рдУрдбреА, / рдУ 1, / рдУ 2рдХреЛрдИ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВрдХреЛрдИ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ
рд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4 рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг
/ рдУ рдбреА041
/ рдУ 1, / рдУ 201

рдЗрд╕ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рднреА, рдЪрд╛рд░ рд╕рдВрдХрд▓рдХреЛрдВ рдиреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рддреАрди рддрд░реАрдХреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рд╣реИред

рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдпреЗ рд╕рдВрдХрд▓рдХ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╕рдВрдХрд▓рд┐рдд рд╣реИрдВред

рд▓рд┐рдирдХреНрд╕ 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 рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВ:
рдЕрдиреБрдХреВрд▓рдирдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд╛рдкрд╕реАрдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯрдХрд╛рд░рдг
рд▓рд┐рдирдХреНрд╕ x86-x64 рдХреНрд▓реИрдВрдЧ 10.0.0
-O0255рдЙрддреНрдкрд╛рджрди рдирд╣реАud2
-рдУ рез, -рдУ реи0рдЙрддреНрдкрд╛рджрди рдирд╣реАрдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
рд▓рд┐рдирдХреНрд╕ x86-x64 gcc 9.3
-O0089рд░рдЬрд┐рд╕реНрдЯрд░ рдЕрд▓ рд╕реЗ рдХрдЪрд░реЗ рдХрд╛ рдПрдХ рдмрд╛рдЗрдЯ
-рдУ 1, -рдУ 2, -рдУ 30рдЙрддреНрдкрд╛рджрди рдирд╣реАрдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
macOs X Apple рдХреНрд▓реИрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг 11.0.0
-O000рд░реИрдо рд╕реЗ рдПрдХ рдмрд┐рдЯ рдХрдЪрд░рд╛
-рдУ рез, -рдУ реи00рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЦрд░рд╛рдм () рд╢реВрдиреНрдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, рдореВрд▓ рдЙрджрд╛рд╣рд░рдг
/ рдУрдбреА, / рдУ 1, / рдУ 2рдХреЛрдИ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВрдХреЛрдИ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВрдХреЛрдИ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ
рд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4 рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг
/ рдУ рдбреА041рд░рдЬрд┐рд╕реНрдЯрд░ рдЕрд▓ рд╕реЗ рдХрдЪрд░реЗ рдХрд╛ рдПрдХ рдмрд╛рдЗрдЯ
/ рдУ 1, / рдУ 201рд░реИрдо рд╕реЗ рдХрдЪрд░реЗ рдХрд╛ рдПрдХ рдмрд╛рдЗрдЯ

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдиреЗ 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 рдмреА рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖


рдмреВрд▓рд┐рдпрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╡рд┐рдШрдЯрди рдХреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЧрдВрднреАрд░ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдХреНрдпреЛрдВ рд╣реБрдЖ?

рдХреНрдпреЛрдВрдХрд┐ рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рддрд╣рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдЪ рдХрдбрд╝рд╛рдИ рд╕реЗ рдПрдХ рдЗрдХрд╛рдИ рд╣реИред

рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрд╕рд╣рдорддрд┐ рдореЗрдВ рдирд╣реАрдВ рдорд╛рдиреЗрдВрдЧреЗ - рдпрд╣ рд▓реЗрдЦ рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рдирд┐рдХрд▓рд╛ред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ:
рдЕрдиреБрдХреВрд▓рдирдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд╛рдкрд╕реАрдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯрдХрд╛рд░рдгрдЦрд░рд╛рдм рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо ()
рд▓рд┐рдирдХреНрд╕ x86-x64 рдХреНрд▓реИрдВрдЧ 10.0.0
-O0255рдЙрддреНрдкрд╛рджрди рдирд╣реАud2
-рдУ рез, -рдУ реи0рдЙрддреНрдкрд╛рджрди рдирд╣реАрдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
рд▓рд┐рдирдХреНрд╕ x86-x64 gcc 9.3
-O0089рд░рдЬрд┐рд╕реНрдЯрд░ рдЕрд▓ рд╕реЗ рдХрдЪрд░реЗ рдХрд╛ рдПрдХ рдмрд╛рдЗрдЯрдХрд╛рдо рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди:
рдирд╣реАрдВ; ==; =; <; >; <=; > =; std :: рд╣реИрд╢ред
-рдУ 1, -рдУ 2, -рдУ 30рдЙрддреНрдкрд╛рджрди рдирд╣реАрдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЦрд░рд╛рдм () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
macOs X Apple рдХреНрд▓реИрдВрдЧ рд╕рдВрд╕реНрдХрд░рдг 11.0.0
-O000рд░реИрдо рд╕реЗ рдПрдХ рдмрд┐рдЯ рдХрдЪрд░рд╛
-рдУ рез, -рдУ реи00рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЦрд░рд╛рдм () рд╢реВрдиреНрдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4, рдореВрд▓ рдЙрджрд╛рд╣рд░рдг
/ рдУрдбреА, / рдУ 1, / рдУ 2рдХреЛрдИ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВрдХреЛрдИ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВрдХреЛрдИ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ
рд╡рд┐рдВрдбреЛрдЬ MSVC 2019 16.5.4 рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг
/ рдУ рдбреА041рд░рдЬрд┐рд╕реНрдЯрд░ рдЕрд▓ рд╕реЗ рдХрдЪрд░реЗ рдХрд╛ рдПрдХ рдмрд╛рдЗрдЯрдХрд╛рдо рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди:
==; =; <; >; <=; > =; std :: рд╣реИрд╢ред
/ рдУ 1, / рдУ 201рд░реИрдо рд╕реЗ рдХрдЪрд░реЗ рдХрд╛ рдПрдХ рдмрд╛рдЗрдЯрдХрд╛рдо рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди:
==; =; <; >; <=; > =; std :: рд╣реИрд╢ред

рдЪрд╛рд░ рд╕рдВрдХрд▓рдХ рдиреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ 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 рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрд╕рдВрджреЗрд╢ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЦрд░рд╛рдм (рдЗрдВрдЯ) рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджреЛ рдорд╛рдиреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдкрде рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдПрдХ рдХреЙрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рдмрд╛рд░ - рдкрд╣рд▓реЗ рддрд╛рд▓рд┐рдХрд╛, рдлрд┐рд░ рдЕрд╕реНрдкрд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЕрд╕рд╣рдорддрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдгред
рдЕрдиреБрдХреВрд▓рдиProgram returnConsole output
Linux x86-x64 Clang 10.0.0
-O0255rnd: 1804289383ud2
-O1, -O20rnd: 1804289383
Test::Test(142)
142
Test::~Test()
if (v == 1) . else if else.
Linux x86-x64 gcc 9.3
-O00rnd: 1804289383
4198608
Test::~Test()
nop .
value .
-O1, -O2, -O30rnd: 1804289383
Test::Test(142)
142
Test::~Test()
if (v == 1) . else if else.
macOs X Apple clang version 11.0.0
-O0The program has unexpectedly finished.rnd: 16807ud2
-O1, -O20rnd: 16807
Test::Test(142)
142
Test::~Test()
if (v == 1) . else if else.
Windows MSVC 2019 16.5.4
/Od /RTCsAccess violation reading location 0x00000000CCCCCCCCrnd: 41MSVC stack frame run-time error checking
/Od, /O1, /O20
рд░реЗрдВрдб : 41 8791061810776
рдЯреЗрд╕реНрдЯ :: ~ рдЯреЗрд╕реНрдЯ ()
рдПрдХ рд╕реНрдореГрддрд┐ рд╕реНрдерд╛рди рд╕реЗ рдХрдЪрд░рд╛ рдЬрд┐рд╕рдХрд╛ рдкрддрд╛ рд░рдХреНрд╕ рдореЗрдВ рд╣реИ

рдлрд┐рд░ рд╕реЗ рд╣рдо рдХрдИ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦрддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд 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 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ;
  • рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдиреЗрдВред

рд╕рднреА рд╕рдВрдХрд▓рдХ рдиреЗ рдорд╛рдирдХ рдХрд╛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд╛рд▓рди рдХрд┐рдпрд╛ - рдХрд┐рд╕реА рднреА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖред рд▓реЗрдХрд┐рди рдЖрдк рдбреЗрд╡рд▓рдкрд░реЛрдВ рдХреЛ рдлрдВрддрд╛рд╕реА рд╕реЗ рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдЕрдХреНрд╕рд░, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реВрдХреНрд╖реНрдо рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ: рдпрд╣ рдХреЛрдб рдХреА рдПрдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реЗрдЦрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛рдлреА рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдмрд╛рдж рдореЗрдВ рдкрд╣реЗрд▓рд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдРрд╕реЗ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

All Articles