C ++ 20 рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ


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


рд▓реЗрдХрд┐рди C ++ 20 рд╕реЗ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдорд╛рдирдХ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред


рдЯреАрдПрд▓, рдбреЙ


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


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


рд╣реЛрд░ рдХрд╛ рддрд░реНрдХ


рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдорд╛рди рд╣рд╛рд╡рд░ рддрд░реНрдХ ( 1 , 2 ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред


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


рдЕрдиреБрдмрдВрдз рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ


( 1 , 2 )


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


рдХрднреА-рдХрднреА рдЙрддреНрдкрд╛рдж рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреА рднреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЙрдирдХреА рдЧреИрд░-рдкреВрд░реНрддрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрд╡рд╛рдж рдХреА рдкреАрдврд╝реА рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддреА рд╣реИред


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


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


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


рддреЛ, рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИрдВ:


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

C ++ рдореЗрдВ рдЕрдиреБрдмрдВрдз рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ


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


C ++ рдореЗрдВ, C ++ 20 рдорд╛рдирдХ рд╕реЗ рдкрд╣рд▓реЗ, рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:


  • рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдмрд╣реБрдд рдЕрдирд╛рдбрд╝реА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ред
  • рдПрдХрд▓ рд╢реИрд▓реА рдХреА рдХрдореАред
  • рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ред

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


рдЗрд╕ рд░реВрдк рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдХреЛ рдмрджрд╕реВрд░рдд рдФрд░ рдЕрдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ C ++ рдореЗрдВ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред


рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ C ++ 20 рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛ред
рдФрд░ рдлрд┐рд░, рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЗрд╕ рд╕рдм рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:


int f(int x, int y) [[ expects: x > 0 ]] // precondition [[ expects: y > 0 ]] // precondition [[ ensures r: r < x + y ]] // postcondition { int z = (x - x%y) / y; [[ assert: z >= 0 ]]; // assertion return z + y; } 

рдХреЛрд╢рд┐рд╢


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


рдпреВрдирд┐рд╡рд░реНрд╕рд┐рдбрд▓ рдХрд╛рд░реНрд▓реЛрд╕ III рдбреА рдореИрдбреНрд░рд┐рдб рдХреЗ рдПрдЖрд░рд╕реАрдУрдПрд╕ рдЕрдиреБрд╕рдВрдзрд╛рди рд╕рдореВрд╣ рдиреЗ рдХреНрд▓реИрдВрдЧ ++ рдХрд╛рдВрдЯрд╛ рдореЗрдВ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред


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


рдЕрд╕реЗрдВрдмрд▓реА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЧреАрдереВрдм рднрдВрдбрд╛рд░ рдХреЗ рд░реАрдбрдореА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
https://github.com/arcosuc3m/clang-contracts


 git clone https://github.com/arcosuc3m/clang-contracts/ mkdir -p clang-contracts/build/ && cd clang-contracts/build/ cmake -G "Unix Makefiles" -DLLVM_USE_LINKER=gold -DBUILD_SHARED_LIBS=ON -DLLVM_USE_SPLIT_DWARF=ON -DLLVM_OPTIMIZED_TABLEGEN=ON ../ make -j8 

рдореБрдЭреЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рд╕реВрддреНрд░реЛрдВ рдХреЗ рд╕рдВрдХрд▓рди рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред


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


 /home/valmat/work/git/clang-contracts/build/bin/clang++ -std=c++2a -build-level=audit -g test.cpp -o test.bin 

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


 git clone https://github.com/valmat/cpp20-contracts-examples/ cd cpp20-contracts-examples make CPP=/path/to/clang++ 

рдпрд╣рд╛рдБ /path/to/clang++ рдЖрдкрдХреЗ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ clang++ рдмрд╛рдЗрдирд░реА рдХрд╛ рдорд╛рд░реНрдЧ рд╣реИред


рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, ARCOS рдЕрдиреБрд╕рдВрдзрд╛рди рд╕рдореВрд╣ рдиреЗ рдЕрдкрдиреЗ рдХрд╛рдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред


C ++ 20 рдореЗрдВ рдЕрдиреБрдмрдВрдз рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ


рдЕрдм рдХреБрдЫ рднреА рд╣рдореЗрдВ рдЕрдиреБрдмрдВрдз рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдкрд░ рд╢реЛрдз рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдФрд░ рддреБрд░рдВрдд рдЗрди рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдиреБрдмрдВрдз рдкреВрд░реНрд╡ рд╢рд░реНрдд, рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рдФрд░ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ (рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ) рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред


C ++ 20 рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ


 [[contract-attribute modifier identifier: conditional-expression]] 

рдЬрд╣рд╛рдБ contract-attribute рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реЗ рд╕рдХрддреА рд╣реИ:
рдЕрдкреЗрдХреНрд╖рд╛ , рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдпрд╛ рдореБрдЦрд░ ред


рдЙрдореНрдореАрджреЗрдВ рдкреВрд░реНрд╡ рд╢рд░реНрдд рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ expects , рдмрдпрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рдФрд░ рдореБрдЦрд░рддрд╛ ensures ред


conditional-expression рдПрдХ рдмреВрд▓рд┐рдпрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬреЛ рдПрдХ рдЕрдиреБрдмрдВрдз рд╡рд┐рдзреЗрдп рдореЗрдВ рдорд╛рдиреНрдп рд╣реИред
modifier рдФрд░ identifier рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдореБрдЭреЗ рдПрдХ modifier рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдореИрдВ рдереЛрдбрд╝рд╛ рдХрдо рд▓рд┐рдЦреВрдВрдЧрд╛ред


identifier рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ ensures рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рддрд░реНрдХреЛрдВ рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреА рдкрд╣реБрдВрдЪ рд╣реИред


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


 [[ensures return_variable: expr(return_variable)]] 

рдЬрд╣рд╛рдБ рдЪрд░ рдХреЗ рд▓рд┐рдП return_variable рдХрд┐рд╕реА рднреА рд╡реИрдз рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред


рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкреВрд░реНрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдкрд░ рд▓рдЧрд╛рдП рдЧрдП рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рдиреЛрдВ рдкрд░ рд▓рдЧрд╛рдП рдЧрдП рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рд╣реИред


рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реНрд╡рдзрд╛рд░рдгрд╛ рдФрд░ рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред


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


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


рдпрджрд┐ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реБрдЖ, рддреЛ std::terminate() рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред


Preconditions рдФрд░ postconditions рдХреЛ рд╣рдореЗрд╢рд╛ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХреЗ рдмрд╛рд╣рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред


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


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


рдЙрджрд╛рд╣рд░рдг 1


рд╣рдо рджреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдкрд╢реНрдЪрдЧрд╛рдореА рдФрд░ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп:


 int foo(int x, int y) [[ expects: x > y ]] // precondition #1 [[ expects: y > 0 ]] // precondition #2 [[ ensures r: r < x ]] // postcondition #3 { int z = (x - x%y) / y; [[ assert: z >= 0 ]]; // assertion return z; } int main() { std::cout << foo(117, 20) << std::endl; std::cout << foo(10, 20) << std::endl; // <-- contract violation #1 std::cout << foo(100, -5) << std::endl; // <-- contract violation #2 return 0; } 

рдЙрджрд╛рд╣рд░рдг 2


рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрджреНрдзрддрд┐ рдХрд╛ рдкреВрд░реНрд╡ рд╢рд░реНрдд рдПрдХ рд╕рдВрд░рдХреНрд╖рд┐рдд рдпрд╛ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


 struct X { //protected: int m = 5; public: int foo(int n) [[expects: n < m]] { return n*n; } }; 

рдЕрдиреБрдмрдВрдз рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рднреАрддрд░ рдЪрд░ рдХреЗ рд╕рдВрд╢реЛрдзрди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдЯреВрдЯ рдЧрдпрд╛, рддреЛ рдпреВрдмреА рд╣реЛрдЧрд╛ред


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


 struct X { int m = 5; int foo(int n) [[ expects: n < m++ ]] // UB: Modifies variable m { int k = n*n; [[ assert: ++k < 100 ]] // UB: Modifies variable k return n*n; } }; 

рдЬрдм рдореИрдВ рдЕрдиреБрдмрдВрдз рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕реНрддрд░ рдФрд░ рдмрд┐рд▓реНрдб рдореЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЕрдиреБрдмрдВрдз рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереЛрдбрд╝реА рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред


рдЕрдм рдореИрдВ рд╕рд┐рд░реНрдл рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рдЕрдиреБрдмрдВрдз рдирд╣реАрдВ рдерд╛ред


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


рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреВрд░реНрд╡рд╡рд░реНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 int foo(int n) [[ expects: expr(n) ]] // # 1 [[ ensures r: expr(r) ]] // # 4 [[ expects: expr(n) ]] // # 2 [[ expects: expr(n) ]] // # 3 [[ ensures r: expr(r) ]] // # 5 {...} 

рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рди рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рднреА рдмрддрд╛ рд╕рдХрддреА рд╣реИрдВред


 int foo(int &n) [[ ensures: expr(n) ]]; 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рд╡рд╛рдкрд╕реА рдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


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


рдкреЛрд╕реНрдЯрдХрдВрдбрд┐рд╢рди рдореЗрдВ рдореВрд▓ (рдлрд╝рдВрдХреНрд╢рди рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдкрд░) рдореВрд▓реНрдп рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред


рдЙрджрд╛рд╣рд░рдг :


 void incr(int &n) [[ expects: 3 == n ]] [[ ensures: 4 == n ]] {++n;} 

рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рд╡рд┐рдзреЗрдп рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЗрди рдЪрд░ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рд╡рд┐рдзреЗрдп рдЧрдгрдирд╛ рд╕рдордп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, constexpr рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг :


 int a = 1; constexpr int b = 100; constexpr int foo(int n) [[ expects: a <= n ]] // error: `a` is not constexpr [[ expects: n < b ]] // OK { [[assert: n > 2*a]]; // error: `a` is not constexpr [[assert: n < 2*b]]; // OK return 2*n; } 

рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз


рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрддреЗ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдЕрдиреБрдмрдВрдз рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг :


 int foo(int n) [[expects: n < 10]] { return n*n; } int (*pfoo)(int n) = &foo; 

pfoo(100) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдЧрд╛ред


рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╕рдВрд╡рд┐рджрд╛


рдЕрдиреБрдмрдВрдзреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рдг рдХреЛ рдХрдордЬреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрдкрд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкрджрдмрдВрдз рдФрд░ рдЖрдХреНрд░рдордгрдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдордЬрдмреВрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


C ++ 20 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, C ++ 20 рдореЗрдВ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рди рдХрд┐ рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╡реЗ рдордЬрдмреВрдд рдФрд░ рдХрдордЬреЛрд░ рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЛрдИ assert рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред


рджреВрд╕рд░реЗ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЬрдм рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдП рддреЛ ODR рд╕рдорд╛рди рд╣реИрдВред
рдФрд░, рдЪреВрдВрдХрд┐ рдкреВрд░реНрд╡ рд╢рд░реНрдд рдФрд░ рдкреЛрд╕реНрдЯрдХреЙрдиреНрдбрд┐рд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдлрд┐рд░ рд╡рд╛рд░рд┐рд╕ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


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


рдЙрджрд╛рд╣рд░рдг :


 struct Base { virtual int foo(int n) [[ expects: n < 10 ]] [[ ensures r: r > 100 ]] { return n*n; } }; struct Derived1 : Base { virtual int foo(int n) override [[ expects: n < 10 ]] [[ ensures r: r > 100 ]] { return n*n*2; } }; struct Derived2 : Base { // Inherits contracts from Base virtual int foo(int n) override { return n*3; } }; 

рдЯрд┐рдкреНрдкрдгреА

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдКрдкрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


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


рдПрдХ рдФрд░ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ :


рд░рд┐рдХреЙрд░реНрдб рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП


 virtual int foo(int n) override [[expects: n < 10]] {...} 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА


 inheritance1.cpp:20:36: error: expected ';' at end of declaration list virtual int foo(int n) override ^ ; 

рдФрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛


 virtual int foo(int n) [[expects: n < 10]] override {...} 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╕рдВрдХрд▓рдХ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдФрд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕-рд╕рд╣реА рдХреЛрдб рд╕рдВрдХрд▓рдХ рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред


рдЕрдиреБрдмрдВрдз рд╕рдВрд╢реЛрдзрдХ


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


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


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

рдЙрджрд╛рд╣рд░рдг


 [[expects: expr]] //  default [[expects default: expr]] //  default [[expects axiom : expr]] // Run-time    [[expects audit : expr]] //    

рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдХреМрди рд╕реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХреМрди рд╕рд╛ рдЕрдХреНрд╖рдо рд╣реЛрдЧрд╛ред


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


рд╕рдВрдХрд▓рдХ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░, рдПрдХреНрд╕рд┐рдУрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ axiom рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ


 -axiom-mode=<mode> 

-axiom-mode=on axiom рдореЛрдб -axiom-mode=on рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ axiom рд╕рд╛рде рджрд╛рд╡реЛрдВ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ ,


-axiom-mode=off рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рдореЛрдб рдмрдВрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ axiom рд╕рд╛рде рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг :


 int foo(int n) [[expects axiom: n < 10]] { return n*n; } 

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


  • off рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рд╕рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЬрд╛рдВрдЪ рдмрдВрдж off рджреЗрддрд╛ рд╣реИ
  • default рдХреЗрд╡рд▓ default рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ
  • audit рдЙрдиреНрдирдд рдореЛрдб рдЬрдм рд╕рднреА рдЪреЗрдХ default рдФрд░ audit рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ

рдХрдВрдкрд╛рдЗрд▓рд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рд╕рддреНрдпрд╛рдкрди рд╕реНрддрд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдХреИрд╕реЗ рд╣реИред


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ


 -build-level=<off|default|audit> 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ -build-level=default


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


рдореИрдВ рдЕрдЧрд▓реЗ рдЦрдВрдб рддрдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реНрддрд░реЛрдВ рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджреВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рдЙрдиреНрд╣реЗрдВ рджреГрд╢реНрдп рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЕрдиреБрдмрдВрдз рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреА рдЕрд╡рд░реЛрдзрди


рдЕрдиреБрдмрдВрдз рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд┐рд╕ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рджреГрд╢реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред


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


рд╕рдВрдХрд▓рди рдкрд░, рдЖрдк рдЙрд▓реНрд▓рдВрдШрди рд╣реИрдВрдбрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╣реИрдВрдбрд▓рд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рдВрдХрд▓рдХ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рд╣реИред


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣


 -contract-violation-handler=<violation_handler> 

рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП


 void(const std::contract_violation& info) 

рдпрд╛


 void(const std::contract_violation& info) noexcept 

std::contract_violation рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:


 struct contract_violation { uint_least32_t line_number() const noexcept; std::string_view file_name() const noexcept; std::string_view function_name() const noexcept; std::string_view comment() const noexcept; std::string_view assertion_level() const noexcept; }; 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣реИрдВрдбрд▓рд░ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдмрдВрдз рд╢рд░реНрддреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд╣рд╛рдВ рдФрд░ рдХрд┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реБрдЖред


рдпрджрд┐ рдЙрд▓реНрд▓рдВрдШрди рд╣реИрдВрдбрд▓рд░ рд╣реИрдВрдбрд▓рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдиреБрдмрдВрдз рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, std::abort() рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╣реИрдВрдбрд▓рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛, std::terminate() рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛)ред


рдорд╛рдирдХ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрдиреБрдмрдВрдз рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдмрд╛рдж рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред


рдЗрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рдВрдХрд▓рдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ


 -fcontinue-after-violation 

-fcontinue-after-violation рдФрд░ -contract-violation-handler рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк -fcontinue-after-violation рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реЗрдЯ -fcontinue-after-violation -contract-violation-handler ред рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдиреБрдмрдВрдз рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдмрд╛рдж, рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╕ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред


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


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


рдпрд╣ рд╕рдВрдХрд▓рдХ рдЕрдиреБрдмрдВрдз рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИред


рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдЬрд╛рдирдХрд╛рд░реА рджрд░реНрдЬ рдХрд░рдиреЗ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЕрдиреБрдмрдВрдз рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


 void violation_handler(const std::contract_violation& info) { std::cerr << "line_number : " << info.line_number() << std::endl; std::cerr << "file_name : " << info.file_name() << std::endl; std::cerr << "function_name : " << info.function_name() << std::endl; std::cerr << "comment : " << info.comment() << std::endl; std::cerr << "assertion_level : " << info.assertion_level() << std::endl; } 

рдФрд░ рдЕрдиреБрдмрдВрдз рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 #include "violation_handler.h" int foo(int n) [[expects: n < 10]] { return n*n; } int main() { foo(100); // <-- contract violation return 0; } 

рд╣рдо рд╡рд┐рдХрд▓реНрдк -contract-violation-handler=violation_handler -fcontinue-after-violation -contract-violation-handler=violation_handler -fcontinue-after-violation рдФрд░ -fcontinue-after-violation рдФрд░ рд░рди рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


 $ bin/example8-handling.bin line_number : 4 file_name : example8-handling.cpp function_name : foo comment : n < 10 assertion_level : default 

рдЕрдм рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реНрддрд░реЛрдВ рдФрд░ рдЕрдиреБрдмрдВрдз рдореЛрдб рдкрд░ рдЕрдиреБрдмрдВрдз рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 #include "violation_handler.h" int foo(int n) [[ expects axiom : n < 100 ]] [[ expects default : n < 200 ]] [[ expects audit : n < 300 ]] { return 2 * n; } int main() { foo(350); // audit foo(250); // default return 0; } 

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ -build-level=off рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде -build-level=off , рддреЛ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ, рдЕрдиреБрдмрдВрдзреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреАред


default рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ (рд╡рд┐рдХрд▓реНрдк -build-level=default ), рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:


 $ bin/example9-default.bin line_number : 5 file_name : example9.cpp function_name : foo comment : n < 200 assertion_level : default line_number : 5 file_name : example9.cpp function_name : foo comment : n < 200 assertion_level : default 

рдФрд░ audit рд╕реНрддрд░ рд╡рд╛рд▓реА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рджреЗрдЧреА:


  $ bin/example9-audit.bin line_number : 5 file_name : example9.cpp function_name : foo comment : n < 200 assertion_level : default line_number : 6 file_name : example9.cpp function_name : foo comment : n < 300 assertion_level : audit line_number : 5 file_name : example9.cpp function_name : foo comment : n < 200 assertion_level : default 

рдЯрд┐рдкреНрдкрдгреА


violation_handler рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдЕрдкрд╡рд╛рдж рдХреЗ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛред


рдпрджрд┐ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛ noexcept рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ noexcept рдФрд░ рдЬрдм рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ noexcept рдХреЛ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ std::terminate() рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред


рдЙрджрд╛рд╣рд░рдг


 void violation_handler(const std::contract_violation&) { throw std::exception(); } int foo(int n) noexcept [[ expects: n > 0 ]] { return n*n; } int main() { foo(0); // <-- std::terminate() when violation handler throws an exception return 0; } 

рдпрджрд┐ рдзреНрд╡рдЬ рд╕рдВрдХрд▓рдХ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрдиреБрдмрдВрдз рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рди рд░рдЦреЗрдВ ( continuation mode=off ), рд▓реЗрдХрд┐рди рдЙрд▓реНрд▓рдВрдШрди рд╣реИрдВрдбрд▓рд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ std::terminate() рдордЬрдмреВрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


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


рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рдиреЙрди-рдЗрдВрдЯреНрд░рд╕рд┐рд╡ рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╡реЗ рдЬрд╛рд░реА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред


C ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рджрд╛рд╡реЗ рд╣реЛрдВрдЧреЗред рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд░рд╛рдп рдореЗрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рджреГрд╢реНрдп рд╣реЛ рдЧрдпрд╛ред


C ++ 20 рдЕрдиреБрдмрдВрдз рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп, рддреЗрдЬ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдПрдВрдЧреЗред рдореИрдВ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдореЗрдВ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реВрдВред




рдкреБрдирд╢реНрдЪ
рдкреАрдПрдо рдореЗрдВ, рд╡реЗ рдореБрдЭреЗ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╢рд╛рдпрдж рдорд╛рдирдХ expects рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдФрд░ ensures рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрд░рдорд╢рдГ pre рдФрд░ post рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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


All Articles