рд╣рдо рдСрд░реНрдЪрд░реНрдб рд╕реАрдПрдордПрд╕ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ

рдЪрд┐рддреНрд░ 6

рдпрд╣ рд▓реЗрдЦ PVS-Studio рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрд░реНрдЪрд░реНрдб рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдлрд┐рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдСрд░реНрдЪрд░реНрдб рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдХрдВрдЯреЗрдВрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рд╣реИ рдЬреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рдЧреИрд░-рд▓рд╛рднрдХрд╛рд░реА ASP.NET рдЧреИрд▓рд░реА Outercurve Foundation рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкрд╣рд▓реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рдж рдХрд╛рдлреА рдмрдврд╝ рдЧрдП рд╣реИрдВред рдирдИ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрдЧ рдЖрдкрдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реА рд╣реИрдВред

рдСрд░реНрдЪрд░реНрдб рд╕реАрдПрдордПрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

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

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

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

рдорд╛рдиреНрдпрддрд╛ рдкрд░рд┐рдгрд╛рдо

рдореИрдВ рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдХреБрдЫ рдЖрдВрдХрдбрд╝реЗ рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рди рдХрд░рдирд╛ рдкрдбрд╝реЗред

".Cs рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ (3739 рдЯреБрдХрдбрд╝реЗ) рдиреЗ рдЕрдВрддрд┐рдо рдЬрд╛рдВрдЪ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ред рдХреБрд▓ рдореЗрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдХреЛрдб рдХреА 214,564 рд▓рд╛рдЗрдиреЗрдВ рдереАрдВред рдСрдбрд┐рдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, 137 рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рдереАрдВред рдкрд╣рд▓реЗ (рдЙрдЪреНрдЪ) рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реНрддрд░ рдкрд░, 39 рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рдереАрдВред рджреВрд╕рд░реЗ рд╕реНрддрд░ (рдФрд╕рдд) рдкрд░, 60 рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рдорд┐рд▓реАрдВред тАЭ

рдлрд┐рд▓рд╣рд╛рд▓, рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ 2767 .cs рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд╣рдЬрд╛рд░ рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рдХрдо рд╣реЛ рдЧрдИ рд╣реИред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдореА рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдирд╛рдо рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╕реЗ рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдПрдХ рдХрд░реНрдиреЗрд▓ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ ( 966 рдХреЗ рд▓рд┐рдП )ред рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдХреЛрдб рдХреА 108,287 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ 153 рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреА, 33 рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░, 70 рдФрд╕рддрдиред рд╣рдо рдЖрдорддреМрд░ рдкрд░ рддреАрд╕рд░реЗ рд╕реНрддрд░ рдХреА рдЪреЗрддрд╛рд╡рдиреА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдкрд░рдВрдкрд░рд╛ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рд╛ рд╣реИред

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА : V3110 'TryValidateModel' рдкрджреНрдзрддрд┐ рдХреЗ рднреАрддрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ред рдЙрдкрд╕рд░реНрдЧрдХреГрддрдореЛрдбреБрд▓реЗрдкрджрддреНрд░ edрекule ule

public bool TryValidateModel(object model, string prefix) { return TryValidateModel(model, Prefix(prefix)); } 

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рддрд░рд╣, рд╣рдо рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдЦреЛрд▓рддреЗ рд╣реИрдВред рдпрд╣ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ TryValidateModel рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдПрдХрд▓ рддрд░реНрдХ рдЕрдзрд┐рднрд╛рд░ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 public bool TryValidateModel(object model) { return _updateModel.TryValidateModel(model); } 

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

 public bool TryValidateModel(object model, string prefix) { return _updateModel.TryValidateModel(model, Prefix(prefix)); } 

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3008 'рд╕рд╛рдордЧреНрд░реА' рдЪрд░ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рдмрд╛рд░ рдорд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИред рдЪреЗрдХ рд▓рд╛рдЗрди: 197, 190. рдбрд╛рдпрдиреЗрдорд┐рдХрдЪреИрдЯреЗрдЧ рд╣реЗрд▓реНрдкрд░ред 197

 public override async Task ProcessAsync(....) { .... IHtmlContent content; .... try { content = await output.GetChildContentAsync(); } finally { _cacheScopeManager.ExitScope(); } content = await ProcessContentAsync(output, cacheContext); .... } 

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

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА : V3080 рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рд╛рдВрддрд┐ ред 'рдЖрдЗрдЯрдордЯреИрдЧ' рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред CoreShapes.cs 92

 public async Task<IHtmlContent> List(....string ItemTag....) { .... string itemTagName = null; if (ItemTag != "-") { itemTagName = string.IsNullOrEmpty(ItemTag) ? "li" : ItemTag; } var index = 0; foreach (var item in items) { var itemTag = String.IsNullOrEmpty(itemTagName) ? null : ....; .... itemTag.InnerHtml.AppendHtml(itemContent); listTag.InnerHtml.AppendHtml(itemTag); ++index; } return listTag; } 

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

 public async Task<IHtmlContent> List(....string ItemTag....) { .... string itemTagName = null; if (ItemTag != "-") { itemTagName = string.IsNullOrEmpty(ItemTag) ? "li" : ItemTag; } var index = 0; foreach (var item in items) { var itemTag = ....; if(String.IsNullOrEmpty(itemTag)) throw .... .... itemTag.InnerHtml.AppendHtml(itemContent); listTag.InnerHtml.AppendHtml(itemTag); ++index; } return listTag; } 

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3095 рдирд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рддреНрдпрд╛рдкрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ 'RemoteClient' рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрд╛рдБрдЪ рд▓рд╛рдЗрдиреЗрдВ: 49, 51. ImportRemoteInstanceController.cs 49

 public async Task<IActionResult> Import(ImportViewModel model) { .... var remoteClient = remoteClientList.RemoteClients.FirstOrDefault(....); var apiKey = Encoding.UTF8.GetString(....(remoteClient.ProtectedApiKey)); if (remoteClient == null || ....) { .... } .... } 

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

 public async Task<IActionResult> Import(ImportViewModel model) { .... var remoteClient = remoteClientList.RemoteClients.FirstOrDefault(....); if (remoteClient != null) var apiKey = UTF8.GetString(....remoteClient.ProtectedApiKey); else if (....) { .... } .... } 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ First рдХреЗ рд╕рд╛рде FirstOrDefault рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЪреЗрдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ 7.05 рдмреАрдЯрд╛ рд╕реЗ:

рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдордиреЗ LINQ рд╕реЗ рд╕рднреА orDefault methods рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдП рдбрд╛рдпрдЧреНрдиреЙрд╕реНрдЯрд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдмрд┐рдирд╛ рдЬрд╛рдВрдЪ рдХреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдбреАрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдкреНрд░рддреНрдпреЗрдХ orDefault рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрд╕рд╛ рдПрдирд╛рд▓реЙрдЧ рд╣реИ рдЬреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ рдпрджрд┐ рдЙрдкрдпреБрдХреНрдд рддрддреНрд╡ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдпрд╣ рдЕрдкрд╡рд╛рдж рдЕрдореВрд░реНрдд NullReferenceException рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдирд┐рджрд╛рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред 27 рд╕рдВрднрд╛рд╡рд┐рдд рдЦрддрд░рдирд╛рдХ рд╕реНрдерд╛рдиред рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:

ContentTypesAdminNodeNavigationBuilder.cs 71:

 var treeBuilder = treeNodeBuilders.Where(....).FirstOrDefault(); await treeBuilder.BuildNavigationAsync(childNode, builder, treeNodeBuilders); 

ListPartDisplayDriver.cs 217:

 var contentTypePartDefinition = ....Parts.FirstOrDefault(....); return contentTypePartDefinition.Settings....; 

ContentTypesAdminNodeNavigationBuilder.cs 113:

 var typeEntry = node.ContentTypes.Where(....).FirstOrDefault(); return AddPrefixToClasses(typeEntry.IconClass); 

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА : V3080 рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рд╛рдВрддрд┐ ред рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: CreateScope ()ред SetupService.cs 136

 public async Task<string> SetupInternalAsync(SetupContext context) { .... using (var shellContext = await ....) { await shellContext.CreateScope().UsingAsync(....); } .... } 

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

 public ShellScope CreateScope() { if (_placeHolder) { return null; } var scope = new ShellScope(this); // A new scope can be only used on a non released shell. if (!released) { return scope; } scope.Dispose(); return null; } 

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

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

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

V3080 рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рдХреНрддрддрд╛ ред рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: CreateScope ()ред SetupService.cs 192

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3127 рджреЛ рд╕рдорд╛рди рдХреЛрдб рдЕрдВрд╢ рдкрд╛рдП рдЧрдПред рд╢рд╛рдпрдж, рдпрд╣ рдПрдХ рдЯрд╛рдЗрдкреЛ рд╣реИ рдФрд░ 'ConsumerSecret' TwitterClientMessageHandler.cs 52 рдХреЗ рдмрдЬрд╛рдп 'AccessTokenSecret' рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

 public async Task ConfigureOAuthAsync(HttpRequestMessage request) { .... if (!string.IsNullOrWhiteSpace(settings.ConsumerSecret)) settings.ConsumerSecret = protrector.Unprotect(settings.ConsumerSecret); if (!string.IsNullOrWhiteSpace(settings.ConsumerSecret)) settings.AccessTokenSecret = protrector.Unprotect(settings.AccessTokenSecret); .... } 

рдХреНрд▓рд╛рд╕рд┐рдХ рдХреЙрдкреА-рдкреЗрд╕реНрдЯред ConsumerSecret рдХреЛ рджреЛ рдмрд╛рд░ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдФрд░ AccessTokenSecret - рдПрдХ рдмрд╛рд░ рдирд╣реАрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЖрдкрдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 public async Task ConfigureOAuthAsync(HttpRequestMessage request) { .... if (!string.IsNullOrWhiteSpace(settings.ConsumerSecret)) settings.ConsumerSecret = protrector.Unprotect(settings.ConsumerSecret); if (!string.IsNullOrWhiteSpace(settings.AccessTokenSecret)) settings.AccessTokenSecret = protrector.Unprotect(settings.AccessTokenSecret); .... } 

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3139 рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗрд╕-рд╢рд╛рдЦрд╛рдПрдБ рдПрдХ рд╣реА рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред SerialDocumentExecuter.cs 23

рдПрдХ рдФрд░ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдЧрд▓рддреАред рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреВрд░реА рдХрдХреНрд╖рд╛ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЫреЛрдЯрд╛ рд╣реИред

 public class SerialDocumentExecuter : DocumentExecuter { private static IExecutionStrategy ParallelExecutionStrategy = new ParallelExecutionStrategy(); private static IExecutionStrategy SerialExecutionStrategy = new SerialExecutionStrategy(); private static IExecutionStrategy SubscriptionExecutionStrategy = new SubscriptionExecutionStrategy(); protected override IExecutionStrategy SelectExecutionStrategy(....) { switch (context.Operation.OperationType) { case OperationType.Query: return SerialExecutionStrategy; case OperationType.Mutation: return SerialExecutionStrategy; case OperationType.Subscription: return SubscriptionExecutionStrategy; default: throw ....; } } } 

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рджреЛ рд╕рдорд╛рди рдорд╛рдорд▓реЛрдВ рдХреА рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рд╕рдВрджрд┐рдЧреНрдз рдорд╛рдирд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдХреНрд╖рд╛ рдореЗрдВ рддреАрди рд╕рдВрд╕реНрдерд╛рдПрдБ рд╣реИрдВ, рджреЛ рдЬрдм рд▓реМрдЯрддреА рд╣реИрдВ, рддреЛ рдПрдХ рдирд╣реАрдВред рдпрджрд┐ рдпрд╣ рдпреЛрдЬрдирд╛рдмрджреНрдз рд╣реИ рдФрд░ рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рджреЛ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 switch (context.Operation.OperationType) { case OperationType.Query: case OperationType.Mutation: return SerialExecutionStrategy; case OperationType.Subscription: return SubscriptionExecutionStrategy; default: throw ....; } 

рдпрджрд┐ рдпрд╣ рдПрдХ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рддреНрд░реБрдЯрд┐ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 switch (context.Operation.OperationType) { case OperationType.Query: return ParallelExecutionStrategy; case OperationType.Mutation: return SerialExecutionStrategy; case OperationType.Subscription: return SubscriptionExecutionStrategy; default: throw ....; } 

рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдореИрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

 switch (context.Operation.OperationType) { case OperationType.Query: return SerialExecutionStrategy; case OperationType.Mutation: return ParallelExecutionStrategy; case OperationType.Subscription: return SubscriptionExecutionStrategy; default: throw ....; } 

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА : V3080 рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рд╛рдВрддрд┐ ред 'рдЕрдиреБрд░реЛрдз' рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЧреНрд░рд╛рдлрдХреНрд▓рд╛рдЗрдирдореЗрдбрд╡реЗрдпрд░.рдХреЗрдПрд╕ 148

 private async Task ExecuteAsync(HttpContext context....) { .... GraphQLRequest request = null; .... if (HttpMethods.IsPost(context.Request.Method)) { .... } else if (HttpMethods.IsGet(context.Request.Method)) { .... request = new GraphQLRequest(); .... } var queryToExecute = request.Query; .... } 

рдкрд╣рд▓реЗ рдЕрдЧрд░ рдмреНрд▓реЙрдХ рдореЗрдВ, рдЕрдиреБрд░реЛрдз рдЪрд░ рдХреЛ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╢реВрдиреНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдореВрд▓реНрдп рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдЬрдЧрд╣ рдкрд░ рдиреАрдбрд┐рдВрдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдеред рдореИрдВрдиреЗ рдЗрди рд╕рднреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдмреЛрдЭрд┐рд▓ рд╣реЛрдЧрд╛ред рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдЬреЛ IsGet рдпрд╛ IsPost рд╡рд┐рдзрд┐ рдХреЗ http рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ ред Microsoft.AspNetCore.Http.HttpMethods рд╡рд░реНрдЧ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдиреМ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдЯрд╛рдПрдВ рдпрд╛ рд╕реЗрдЯ рдХрд░реЗрдВ рдЕрдиреБрд░реЛрдз ExecuteAsync рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ NullReferenceException рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЗрд╕ рд╕рдордп рдРрд╕реЗ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рддреЛ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВред рдиреАрдЪреЗ рд╕рддреНрдпрд╛рдкрди рдЙрджрд╛рд╣рд░рдг:

 private async Task ExecuteAsync(HttpContext context....) { .... if (request == null) throw ....; var queryToExecute = request.Query; .... } 

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА : V3080 рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рд╛рдВрддрд┐ ред рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: Get <ContentPart> (...)ред ContentPartHandlerCoordinator.cs 190

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

 public override async Task LoadingAsync(LoadContentContext context) { .... context.ContentItem.Get<ContentPart>(typePartDefinition.Name) .Weld(fieldName, fieldActivator.CreateInstance()); .... } 

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рд╢рдкрде рд▓реЗрддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рд╡рд┐рдзрд┐ :

 public static TElement Get<TElement>(this ContentElement contentElement....) where TElement : ContentElement { return (TElement)contentElement.Get(typeof(TElement), name); } 

рдпрд╣ рдЙрд╕рдХреЗ рдЕрдзрд┐рднрд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдЪрд▓реЛ рдЙрд╕реЗ рджреЗрдЦреЛ:

 public static ContentElement Get(this ContentElement contentElement....) { .... var elementData = contentElement.Data[name] as JObject; if (elementData == null) { return null; } .... } 

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

рд╡рд┐рдХрд▓реНрдк рдПрдХ:

 public static ContentElement Get(this ContentElement contentElement....) { .... var elementData = contentElement.Data[name] as JObject; if (elementData == null) { throw.... } .... } 

рд╡рд┐рдХрд▓реНрдк рджреЛ:

 public override async Task LoadingAsync(LoadContentContext context) { .... context.ContentItem.Get<ContentPart>(typePartDefinition.Name) ?.Weld(fieldName, fieldActivator.CreateInstance()); .... } 

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА : V3080 рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рд╛рдВрддрд┐ ред 'рдкрд░рд┐рдгрд╛рдореЛрдВ' рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред ContentQueryOrchardRazorHelperExtensions.cs 19

 public static async Task<IEnumerable<ContentItem>> ContentQueryAsync(....) { var results = await orchardHelper.QueryAsync(queryName, parameters); .... foreach (var result in results) { .... } .... } 

рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХрд╛рдлреА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ QueryAsync рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╢реВрдиреНрдп рд╕рдВрджрд░реНрдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╡рд┐рдзрд┐ рд╣реИ:

 public static async Task<IEnumerable> QueryAsync(....) { .... var query = await queryManager.GetQueryAsync(queryName); if (query == null) { return null; } .... } 

рдпрд╣рд╛рдБ GetQueryAsync рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рд╣реИ, рдЖрдк рд╣рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╣реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ:

 public async Task<Query> GetQueryAsync(string name) { var document = await GetDocumentAsync(); if(document.Queries.TryGetValue(name, out var query)) { return query; } return null; } 

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

 public static async Task<IEnumerable<ContentItem>> ContentQueryAsync(....) { var results = await orchardHelper.QueryAsync(queryName, parameters); if(results == null) throw ....; .... foreach (var result in results) { .... } .... } 

рдЪрд┐рддреНрд░ 4


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

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

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



рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рд╕реЗрдирд┐рдХрд┐рдиред рдХреАрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдСрд░реНрдЪрд░реНрдб рд╕реАрдПрдордПрд╕ рдХреЗ рдХреЛрдб рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ ред

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


All Articles