рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдХреНрдпреЛрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП? рднрд╛рдЧ реи

(рдпрд╛ рд╡рд┐рдЪрд┐рддреНрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ, рдЕрд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рд╕рдВрд░реЗрдЦрдг, рд╣реЗ рднрдЧрд╡рд╛рди!)

рджреЛрд╕реНрддреЛрдВ, рдкрд╛рдареНрдпрдХреНрд░рдо "C ++ рдбреЗрд╡рд▓рдкрд░" рдкрд░ рдПрдХ рдирдП рд╕реВрддреНрд░ рдХреЗ рд▓реЙрдиреНрдЪ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╣реБрдд рдХрдо рд╕рдордп рдмрдЪрд╛ рд╣реИред рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд╛рдХреНрдп рдХреНрдпрд╛ рдЯрд╛рдЗрдк рдХрд░ рд░рд╣рд╛ рд╣реИред

рдПрдХ рджрдВрдб рдЯрдВрдХрдг рдХреНрдпрд╛ рд╣реИ?

рд╣рдо рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдБрдЪ рдЧрдП рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЫрджреНрдо рдирд╛рдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ? рдЖрдорддреМрд░ рдкрд░ рджрдВрдб рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдЯреА.рдХреЗ. рдЕрдХреНрд╕рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВред



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

int x = 1 ; //   C float *fp = (float*)&x ; //   //  C++ float *fp = reinterpret_cast<float*>(&x) ; //   printf( тАЬ%f\nтАЭ, *fp ) ; 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛, рдпрд╣ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдЙрдкрдирд╛рдо рд╣реИ, рдЗрд╕рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдиреЗ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЛрдб рдЖрдорддреМрд░ рдкрд░ рдмрд╕ рдХрд╛рдо рдХрд░рддреЗ рдереЗ, рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдп-рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрджреНрдзрддрд┐ рд╕рдВрдШ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ, рдЬреЛ C рдореЗрдВ рдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди C ++ рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ ( рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ :

 union u1 { int n; float f; } ; union u1 u; uf = 1.0f; printf( "%d\nтАЭ, un ); // UB(undefined behaviour)  C++ тАЬn is not the active memberтАЭ 

рдпрд╣ C ++ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдФрд░ рдХреБрдЫ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреЗрд╡рд▓ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреИрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рджреБрд░реБрдкрдпреЛрдЧ рд╣реИред

рд╕рдЬрд╛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ?

C рдФрд░ C ++ рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдзрдиреНрдп рд╡рд┐рдзрд┐ рдпрд╛рджрдЧрд╛рд░ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рд╕рдЬрд╛ рдХреЗ рд▓рд┐рдП рдореЗрдордХреА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдХрджрдо рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ int64_t рджреЛрд╣рд░реЗ рдХреЗ рд╕рдорд╛рди рдЖрдХрд╛рд░ рд╣реИ:

 static_assert( sizeof( double ) == sizeof( int64_t ) ); // C++17    

рд╣рдо memcpy рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 void func1( double d ) { std::int64_t n; std::memcpy(&n, &d, sizeof d); //тАж 

рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрддрд░ рдХреЗ рд╕рд╛рде, рдХреЛрдИ рднреА рд╕рднреНрдп рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рд░реАрдЗрдВрдЯрд░рдкреНрд░рд┐рдЯ_рдХрд╛рд╕реНрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд╕рдорд╛рди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдПрдХ рд╕рдЬрд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдореНрдорд┐рд▓рд┐рдд рд╡рд┐рдзрд┐ред рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдореВрд╡ рд░рдЬрд┐рд╕реНрдЯрд░ ( рдЙрджрд╛рд╣рд░рдг ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдкреБрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЕрд░реНрд░

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ рд╕рд░рдгреА рдХреА рд╕рдЬрд╛ рдХреЛ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдорд╛рди рдкрд░ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ? рд╣рдо рдПрдХ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдЕрдВрддрд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ рд╕рд░рдгреА рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореНрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрд╢рд╛рд╡рд╛рджреА рдЕрднреА рднреА рд╕рдм рдХреБрдЫ рдореЗрдорд╕реАрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБ рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рджреЛрдиреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ ( рдЙрджрд╛рд╣рд░рдг ) рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

 //  ,    int foo( unsigned int x ) { return x ; } // ,  len  sizeof(unsigned int) int bar( unsigned char *p, size_t len ) { int result = 0; for( size_t index = 0; index < len; index += sizeof(unsigned int) ) { unsigned int ui = 0; std::memcpy( &ui, &p[index], sizeof(unsigned int) ); result += foo( ui ) ; } return result; } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо char*p рд▓реЗрддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ sizeof(unsigned int) рдбреЗрдЯрд╛ рдХреЗ рдХрдИ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ unsigned int рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рд╕рдЬрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП foo() рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдЗрд╕реЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рд▓реМрдЯрд╛рдПрдВред ред

рд▓реВрдк рдмреЙрдбреА рдХреЗ рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓реА рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рд╢рд░реАрд░ рдХреЛ unsigned char рдмреЗрд╕ рд╕рд░рдгреА рдореЗрдВ рдПрдХ unsigned int рд░реВрдк рдореЗрдВ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реАрдзреЗ eax рдЬреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ:

 add eax, dword ptr [rdi + rcx] 

рдПрдХ рд╣реА рдХреЛрдб, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд╛рдХреНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП reinterpret_cast рдЙрдкрдпреЛрдЧ рдХрд░ (рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ):

 // ,  len  sizeof(unsigned int) int bar( unsigned char *p, size_t len ) { int result = 0; for( size_t index = 0; index < len; index += sizeof(unsigned int) ) { unsigned int ui = *reinterpret_cast<unsigned int*>(&p[index]); result += foo( ui ); } return result; } 

C ++ 20 рдФрд░ bit_cast

C ++ 20 рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ bit_cast , рдЬреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ constexpr рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдПрдХ float рдореЗрдВ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП bit_cast рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ bit_cast ( рдЙрджрд╛рд╣рд░рдг ):

 std::cout << bit_cast<float>(0x447a0000) << "\n" ; //,  sizeof(float) == sizeof(unsigned int) 

рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдкреНрд░рдХрд╛рд░ рдФрд░ рдЗрд╕рд╕реЗ рдЖрдХрд╛рд░ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ sizeof(unsigned int) рдЕрдХреНрд╖рд░ sizeof(unsigned int) (рдПрдХ 4-рдмрд╛рдЗрдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int рдХреЛ рдорд╛рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдкреНрд░рдХрд╛рд░ рд╕реЗ, рдФрд░ unsigned int рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВред

 struct uint_chars { unsigned char arr[sizeof( unsigned int )] = {} ; //  sizeof( unsigned int ) == 4 }; //  len  4 int bar( unsigned char *p, size_t len ) { int result = 0; for( size_t index = 0; index < len; index += sizeof(unsigned int) ) { uint_chars f; std::memcpy( f.arr, &p[index], sizeof(unsigned int)); unsigned int result = bit_cast<unsigned int>(f); result += foo( result ); } return result ; } 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдореЗрдВ рдЗрд╕ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдпрд╣ рд╡рд░реНрддрдорд╛рди bit_cast рд╕реАрдорд╛ рд╣реИред

рд╕рдВрд░реЗрдЦрдг

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рджреМрд░рд╛рди рднрдВрдбрд╛рд░рдг рдмрд╣рд┐рд╖реНрдХрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рднреА рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕реА рдорд╛рдирдХреЛрдВ рдФрд░ рд╕реА ++ рджреЛрдиреЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдзреАрди рд╣реИрдВ рдЬреЛ рдЙрд╕ рд╕реНрдерд╛рди рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕реНрдореГрддрд┐ рдореЗрдВ) рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реБрд▓рднред C11 рдЦрдВрдб 6.2.8 рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрд░реЗрдЦрдг рд░рд╛рдЬреНрдпреЛрдВ :

рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдЙрди рдкрддреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреА рд╣реИрдВ рдЬрд┐рди рдкрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдБ рд░рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рд╕рдВрд░реЗрдЦрдг рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рд╣реИ рдЬреЛ рд▓рдЧрд╛рддрд╛рд░ рдкрддреЗ рдХреЗ рдмреАрдЪ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд▓рдЧрд╛рддрд╛ рд╣реИ: _Alignas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдХрдбрд╝реЗ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдзрд╛рд░рд╛ 1 рдореЗрдВ C ++ 17 рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд╛рдирдХ [basic.align] :

рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ (6.7.1, 6.7.2) рд╣реЛрддреА рд╣реИрдВ, рдЬреЛ рдЙрди рдкрддреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреА рд╣реИрдВ рдЬрд┐рди рдкрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрдИ рд╡рд╕реНрддреБ рд░рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╕рдВрд░реЗрдЦрдг рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреВрд░реНрдгрд╛рдВрдХ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рд▓рдЧрд╛рддрд╛рд░ рдкрддреЗ рдХреЗ рдмреАрдЪ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдкрд░ рдПрдХ рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ; рд╕рдВрд░реЗрдЦрдг рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ (10.6.2) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдХрдареЛрд░ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

C99 рдФрд░ C11 рджреЛрдиреЛрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рдЬреЛ рдПрдХ рдмрд┐рдирд╛ рд╕рдВрдХреЗрдд рд╡рд╛рд▓реЗ рд╕реВрдЪрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЦрдВрдб 6.3.2.3ред рд╕рдВрдХреЗрдд рдХрд╣рддреЗ рд╣реИрдВ:
рдПрдХ рд╡рд╕реНрддреБ рдпрд╛ рдЖрдВрд╢рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдХреЛ рдПрдХ рдЕрдиреНрдп рд╡рд╕реНрддреБ рдпрд╛ рдЖрдВрд╢рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдореА рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред ...
рд╣рд╛рд▓рд╛рдБрдХрд┐ C ++ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреИрд░рд╛рдЧреНрд░рд╛рдл 1 [basic.align] рд╕реЗ рдпрд╣ рд╡рд╛рдХреНрдп рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
... рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдкрд░ рдПрдХ рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ; ...
рдЙрджрд╛рд╣рд░рдг

рддреЛ рдЪрд▓рд┐рдП рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ:

  • рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ (рдЪрд╛рд░) рдФрд░ рд╕рдВрд░реЗрдЦрд┐рдд (int) рдХреНрд░рдорд╢рдГ 1 рдФрд░ 4 рд╣реИрдВ
  • sizeof (int) 4 рд╣реИ

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдХрд╛рд░ 4 рдХреЗ рдПрдХ рдЪрд╛рд░ рд╕рд░рдгреА рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛, рдЬреИрд╕реЗ рдХрд┐ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХрд╛ рднреА рдЙрд▓реНрд▓рдВрдШрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╕рд░рдгреА рдореЗрдВ 1 рдпрд╛ 2 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рд╕рдВрд░реЗрдЦрдг рд╣реИред

 char arr[4] = { 0x0F, 0x0, 0x0, 0x00 }; //        1  2  int x = *reinterpret_cast<int*>(arr); // Undefined behavior   

рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдпрд╛ рдмрд╕ рддреНрд░реБрдЯрд┐ рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИред рдЬрдмрдХрд┐ рдПрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдПрд▓рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдПрд░реЗ рдореЗрдВ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛:

 alignas(alignof(int)) char arr[4] = { 0x0F, 0x0, 0x0, 0x00 }; int x = *reinterpret_cast<int*>(arr); 

atomicity

рдЕрд╕рдВрддреБрд▓рд┐рдд рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕рдЬрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдкрд░рдорд╛рдгреБрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рд╡реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдкрд░рдорд╛рдгреБ рд╕реНрдЯреЛрд░ x86 рдореЗрдВ рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдкрд░рдорд╛рдгреБ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдЙрд▓реНрд▓рдВрдШрди рдкрдХрдбрд╝реЗ

C ++ рдореЗрдВ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдЕрдЪреНрдЫреЗ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдЙрдкрдХрд░рдг рд╣реИрдВ рд╡реЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдФрд░ рдЕрдиреБрдЪрд┐рдд рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рднрдВрдбрд╛рд░рдг рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗред

-fstrict-aliasing рдФрд░ -Wstrict-aliasing рдЭрдВрдбреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ / рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдорд▓реЗ gcc ( рдЙрджрд╛рд╣рд░рдг ) рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ:

 int a = 1; short j; float f = 1.f; //   ,   TIS ,         printf("%i\n", j = *(reinterpret_cast<short*>(&a))); printf("%i\n", j = *(reinterpret_cast<int*>(&f))); 

рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡рд╣ рдЗрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдорд▓реЗ рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝реЗрдЧрд╛ ( рдЙрджрд╛рд╣рд░рдг ):

 int *p; p=&a; printf("%i\n", j = *(reinterpret_cast<short*>(p))); 

рд╣рд╛рд▓рд╛рдВрдХрд┐ clang рдЗрди рдЭрдВрдбреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдЙрдкрдХрд░рдг рд╣реИ рдЖрд╕рди, рдЬреЛ рдЧрд▓рдд рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдФрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЗ рд╕реАрдзреЗ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣ рдПрдХ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдорд╛рдорд▓реЗ рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ -fsanitize=address

 int *x = new int[2]; // 8 : [0,7]. int *u = (int*)((char*)x + 6); //     x    *u = 1; //    [6-9] printf( "%d\n", *u ); //    [6-9] 

рдЕрдВрддрд┐рдо рдЙрдкрдХрд░рдг рдЬреЛ рдореИрдВ рд╕реБрдЭрд╛рддрд╛ рд╣реВрдВ, рд╡рд╣ C ++ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рди рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдХреЛрдбрд┐рдВрдЧ рдЕрднреНрдпрд╛рд╕ рднреА рд╣реИ рдЬреЛ C- рд╢реИрд▓реА рдХреА рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рджреЛрдиреЛрдВ gcc рдФрд░ -Wold-style-cast рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C -Wold-style-cast рд▓рд┐рдП рдирд┐рджрд╛рди рдХрд░реЗрдВрдЧреЗред -Wold-style-cast ред рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреБрдВрдЬ рдХреЛ reinterpret_cast рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЛрдб рдХреЗ рдЕрдзрд┐рдХ рдЧрд╣рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд░реАрдЗрдВрдЯрд░рдкреНрд░рд┐рдЯ_рдХрд╛рд╕реНрдЯ рдПрдХ рдмреАрдХрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдСрдбрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП reinterpret_cast рд▓рд┐рдП рдХреЛрдбрдмреЗрд╕ рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рд╣реИред

C рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдЙрдкрдХрд░рдг рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ tis-interpreter рднреА рд╣реИ, рдПрдХ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЬреЛ C рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдЙрдкрд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ C рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬрд╣рд╛рдВ -fstrict-aliasing skips рдПрдХ рдорд╛рдорд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред ( рдЙрджрд╛рд╣рд░рдг )

 int a = 1; short j; float f = 1.0 ; printf("%i\n", j = *((short*)&a)); printf("%i\n", j = *((int*)&f)); int *p; p=&a; printf("%i\n", j = *((short*)p)); 

TIS рджреБрднрд╛рд╖рд┐рдпрд╛ рддреАрдиреЛрдВ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ, рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг TIS рдХрд░реНрдиреЗрд▓ рдХреЛ TIS рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╣рддрд╛ рд╣реИ (рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

 ./bin/tis-kernel -sa example1.c ... example1.c:9:[sa] warning: The pointer (short *)(& a) has type short *. It violates strict aliasing rules by accessing a cell with effective type int. ... example1.c:10:[sa] warning: The pointer (int *)(& f) has type int *. It violates strict aliasing rules by accessing a cell with effective type float. Callstack: main ... example1.c:15:[sa] warning: The pointer (short *)p has type short *. It violates strict aliasing rules by accessing a cell with effective type int. 

рдФрд░ рдЕрдВрдд рдореЗрдВ, TySan , рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИред рдпрд╣ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд░ рд╢реИрдбреЛ рдореЗрдореЛрд░реА рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдПрд▓рд╛рдЗрдЬрд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдиреЗ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдЙрдкрдХрд░рдг рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдПрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдЙрд▓реНрд▓рдВрдШрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдХ рдмрдбрд╝рд╛ рдУрд╡рд░рд╣реЗрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖

рд╣рдордиреЗ C рдФрд░ C ++ рдореЗрдВ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд╣рдорд╕реЗ рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░рд╛ рди рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдХреБрдЫ рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдХреБрдЫ рдЫрджреНрдо рдирд╛рдо рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдЯрдВрдХрдг рдХреА рдПрдХ рд╕рдЬрд╛ рд╣реИред рд╣рдордиреЗ рдпрд╣ рднреА рд╕реАрдЦрд╛ рдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рдЙрд░реНрдл тАЛтАЛрд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╕рдЦреНрдд рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдЙрд▓реНрд▓рдВрдШрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред рд╣рдо рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред

рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рдирдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╣реИрдВред рдбрд┐рдмрдЧ рдХреЗ рд▓рд┐рдП рдХрднреА-рдХрднреА рдЗрди рддрд░реАрдХреЛрдВ рд╕реЗ рдореБрдХреНрдд рдЧрд░реНрднрдкрд╛рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧрдВрднреАрд░ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдЙрд▓реНрд▓рдВрдШрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдЙрдкрдХрд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реА ++ рдХреЗ рд▓рд┐рдП рд╡реЗ рдХреЗрд╡рд▓ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкрдХрдбрд╝реЗрдВрдЧреЗ, рдФрд░ рд╕реА рдХреЗ рд▓рд┐рдП рддреАрд╕-рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрд▓реНрд▓рдВрдШрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж: рдЬреЗрдПрдл рдмрд╛рд╕реНрдЯрд┐рдпрди, рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд░ рдбрд┐ рдмреЗрд▓рд╛, рдкрд╛рд╕реНрдХрд▓ рдХреНрд╡реЛрдХ, рдореИрдЯ рдкреАред рдбреНрдЬрд╝реБрдмрд┐рдВрд╕реНрдХреА, рдкреИрдЯреНрд░рд┐рд╕ рд░реЙрдп рдФрд░ рдУрд▓рд╛рдлреБрд░ рд╡реЗрдЬ
рдмреЗрд╢рдХ, рдЕрдВрдд рдореЗрдВ, рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд▓реЗрдЦрдХ рдХреА рд╣реИрдВред

рддреЛ рдПрдХ рдмрдбрд╝реА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдпрд╣рд╛рдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдФрд░ рд╣рдо рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдЦреБрд▓реЗ рджрд░рд╡рд╛рдЬреЗ рдХреЗ рджрд┐рди рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ 14 рдорд╛рд░реНрдЪ рдХреЛ рд░рд╛рдордмрд▓рд░ рдПрдВрдб рдХрдВрдкрдиреА - рджрд┐рдорд┐рддреНрд░реА рд╢рдмреЙрд░реНрдбреЗрд╡ рдореЗрдВ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╡рд┐рдХрд╛рд╕ рд╡рд┐рднрд╛рдЧ рдХреЗ рдкреНрд░рдореБрдЦ рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред

Source: https://habr.com/ru/post/hi443602/


All Articles