C ++ рдореЗрдВ рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ

рдкреГрд╖реНрдарднреВрдорд┐


C ++ рдПрдХ "рдЕрдкреНрд░рдмрдВрдзрд┐рдд" рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдЖрджрд┐ рдХреЛ рд╕рд╣реЗрдЬреЗ рдмрд┐рдирд╛ рдХреНрд░реИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред - рдпрд╣ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд╕рдорд╛рди рд╕реНрдореГрддрд┐ рдореЗрдВ рдЪрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
void fall() { char * s = "short_text"; sprintf(s,"This is very long text"); } 

рдпрд╛
 void fall() { int * pointer = NULL; *pointer = 13; } 


рд╕рднреА рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рдХреЛ "рдкрдХрдбрд╝" рд╕рдХрддреЗ рд╣реИрдВ - рдЬреИрд╕реЗ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ - рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдХрд░реЗрдВ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ, рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╡рд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рдЖрджрд┐) рдЖрджрд┐)

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



рд╡рд┐рдзрд┐ 1: SEH


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

рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

 __try { segfault1(); } __except( condition1 ) { //  ,  condition1 == EXCEPTION_EXECUTE_HANDLER. //  condition1  ()   ,  //  ,   EXCEPTION_EXECUTE_HANDLER //     ,     } __except( condition2 ) { //    } __finally { // ,          } 


рдпрд╣рд╛рдБ рдПрдХ "рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг" рд╣реИ - "рдХреЙрдкреА рдФрд░ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдкреЗрд╕реНрдЯ"
 #include <stdio.h> #include <windows.h> #include <excpt.h> int memento() //  Segfault { MessageBoxA(NULL,"Memento Mori","Exception catched!",NULL); return 0; } void fall() //  segfault { int* p = 0x00000000; *p = 13; } int main(int argc, char *argv[]) { __try { fall(); } __except (EXCEPTION_EXECUTE_HANDLER) { memento(); } } 


рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ __finally рдкреИрд╕реЗ рдХрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ __except рдХреЛ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд╣рд╛рдереЛрдВ рдХреА рд╡рдХреНрд░рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдпрд╣ рддрдХрдиреАрдХ, рдЗрд╕рдХреЗ рд╕рднреА рдЖрдХрд░реНрд╖рдг рдХреЗ рд╕рд╛рде, рдЗрд╕рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:



рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд╡рд┐рдкрдХреНрд╖ рдереЗ рдХрд┐ рдЖрдкрдХреЛ рджреВрд╕рд░реЗ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рд╣реЛрдЧреАред

рд╡рд┐рдзрд┐ 2: POSIX рд╕рд┐рдЧреНрдирд▓



рд╡рд┐рдзрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ рдХрд┐ рджреБрд░реНрдШрдЯрдирд╛ рдХреЗ рд╕рдордп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ POSIX рд╕рдВрджреЗрд╢ SIGSEGV рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдпреВрдирд┐рдХреНрд╕ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░ рд╕рдЪ рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдЪ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреА рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкреЙрдЬрд╝рд┐рдХреНрд╕-рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ) рдФрд░ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдкрд░ рднреАред

рддрдХрдиреАрдХ рд╕рд░рд▓ рд╣реИ - рд╣рдореЗрдВ рдПрдХ SIGSEGV рд╕рдВрджреЗрд╢ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо "рд╡рд┐рджрд╛рдИ рдХреНрд░рд┐рдпрд╛" рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЧрд┐рд░рддрд╛ рд╣реИ:
 void posix_death_signal(int signum) { memento(); //   signal(signum, SIG_DFL); //   exit(3); //  .    ,     . } 

рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 signal(SIGSEGV, posix_death_signal); 


рдпрд╣рд╛рдБ рдПрдХ рддреИрдпрд╛рд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 #include <stdio.h> #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <signal.h> int memento() { int a=0; MessageBoxA(NULL,"Memento mori","POSIX Signal",NULL); return 0; } void fall() { int* p = 0x00000000; *p = 13; } void posix_death_signal(int signum) { memento(); signal(signum, SIG_DFL); exit(3); } int main(int argc, char *argv[]) { signal(SIGSEGV, posix_death_signal); fall(); } 


рдПрд╕рдИрдПрдЪ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд╕рдорд╛рдзрд╛рди "рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб" рд╣реИ (рдЖрдк рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбреНрд░реЙрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИрдВрдбрд▓рд░ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдЧрд╛) рдФрд░ "рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо" - рдпрд╣ рдХрд┐рд╕реА рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рдкреЙрд╕рд┐рдХреНрд╕-рд╕рдВрдЧрдд рдУрдПрд╕ рдХреЗ рддрд╣рддред

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


All Articles