рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реА # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рд┐рдВрдЧрд▓ рд▓рд╛рдЗрди рдХреЛрдб рдпрд╛ рдиреАрдерд░реНрдорд┐рдВрдб рд╕рддреНрдпрд╛рдкрди

рдЪрд┐рддреНрд░ 1

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

Nethermind , Linux, Windows, MacOs рдХреЗ рд▓рд┐рдП .NET Core Ethereum рдХрд╛ рдПрдХ рддреЗрдЬрд╝ рдЧреНрд░рд╛рд╣рдХ рд╣реИред рдПрдереЗрд░рдо рдпрд╛ рдбреАрдПрдкреАрдПрд╕ рдирд┐рдЬреА рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Nethermind GitHub рдкрд░ рд╕реНрдерд┐рдд рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИред рдкрд░рд┐рдпреЛрдЬрдирд╛ 2017 рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЧрдИ рдереА рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИред

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


рдХреНрдпрд╛ рдЖрдкрдХреЛ рдореИрдиреБрдЕрд▓ рд╢реНрд░рдо рдкрд╕рдВрдж рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдЦреЛрдЬрдирд╛ред рд╕рд╣рдордд рд╣реВрдБ, рдХреБрдЫ рдореБрд╢реНрдХрд┐рд▓ рдмрдЧ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ рд╕рд╛рдЗрдЯ рдпрд╛ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдердХрд╛рдК рд╣реИред рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рд╣рдо 5,000 рд▓рд╛рдЗрдиреЗрдВ рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд▓рд╛рдЦ рдпрд╛ рд▓рд╛рдЦ рд░реЗрдЦрд╛рдУрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХрднреА-рдХрднреА рдмрд╣реБрдд рд╣реА рд╕реБрдкрд╛рдЪреНрдп рд░реВрдк рдореЗрдВ рдирд╣реАрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣реАрдВ рд╕реЛрдирд╛ рд╣реИ, рдХрд╣реАрдВ рдХрдо рдФрд░ рдЕрдкрдиреЗ рд╕рдордп рдХрд╛ 100% рдЗрди рд╕рднреА рдЕрдВрддрд╣реАрди рд░реЗрдЦрд╛рдУрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЧрд▓рдд рдЧрд▓рддреА рдХрд╣рд╛рдВ рд╣реИ? рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ, рд╢рд╛рдпрдж рдЖрдзреБрдирд┐рдХ рд╕рд╛рдзрди рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЪрд┐рддреНрд░ рддреАрди

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

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

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

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

PVS-Studio C # Linux / macOS рдХреЗ рд▓рд┐рдП


рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо рдЕрдкрдиреЗ C # рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ .NET рдХреЛрд░ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЖрдИрдбреАрдИ рд░рд╛рдЗрдбрд░ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

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

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд░рд╛рдЗрдбрд░ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рджрд┐рдЦрддрд╛ рд╣реИ:

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

рдереЛрдбрд╝рд╛ рдЖрдХреНрд░реЛрд╢


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

рдореИрдВ рджрд╛рдпрд░реЗ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ 82 рд╕реЗрдВрдЯреАрдореАрдЯрд░ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓реНрдЯреНрд░рд╛рд╡рд╛рдЗрдб рдореЙрдирд┐рдЯрд░ рд╣реИред рдпрджрд┐ рдЖрдк рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдореЗрдВ рдЙрд╕ рдкрд░ рдЖрдИрдбреАрдИ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓рдЧрднрдЧ 340 рд╡рд░реНрдгреЛрдВ рдкрд░ рдлрд┐рдЯ рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, рдореИрдВ рдЬрд┐рди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡реЗ рднреА рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЧрд┐рдЯрд╣рдм рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛:

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

private void LogBlockAuthorNicely(Block block, ISyncPeer syncPeer)
{
    string authorString = (block.Author == null ? null : "sealed by " +
(KnownAddresses.GoerliValidators.ContainsKey(block.Author) ?
KnownAddresses.GoerliValidators[block.Author] : block.Author?.ToString())) ??
(block.Beneficiary == null ? string.Empty : "mined by " +
(KnownAddresses.KnownMiners.ContainsKey(block.Beneficiary) ?
KnownAddresses.KnownMiners[block.Beneficiary] : block.Beneficiary?.ToString()));
    if (_logger.IsInfo)
    {
        if (_logger.IsInfo) _logger.Info($"Discovered a new block
{string.Empty.PadLeft(9 - block.Number.ToString().Length, '
')}{block.ToString(Block.Format.HashNumberAndTx)} {authorString}, sent by
{syncPeer:s}");
    }
}

тЖТ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдВрдХ

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

private void BuildTransitions()
{
    ...
    releaseSpec.IsEip1283Enabled = (_chainSpec.Parameters.Eip1283Transition ??
long.MaxValue) <= releaseStartBlock &&
((_chainSpec.Parameters.Eip1283DisableTransition ?? long.MaxValue) 
> releaseStartBlock || (_chainSpec.Parameters.Eip1283ReenableTransition ??
long.MaxValue) <= releaseStartBlock);           
    ...
}

тЖТ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ

public void 
Will_not_reject_block_with_bad_total_diff_but_will_reset_diff_to_null()
{
    ...
    _syncServer = new SyncServer(new StateDb(), new StateDb(), localBlockTree,
NullReceiptStorage.Instance, new BlockValidator(Always.Valid, new
HeaderValidator(localBlockTree, Always.Valid, MainnetSpecProvider.Instance,
LimboLogs.Instance), Always.Valid, MainnetSpecProvider.Instance, 
LimboLogs.Instance), Always.Valid, _peerPool, StaticSelector.Full, 
new SyncConfig(), LimboLogs.Instance);
    ...     
}

тЖТ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ

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

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


рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдЬреЛ 0 рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ


рд╢рд░реНрдд 1

public ReceiptsMessage Deserialize(byte[] bytes)
{
    if (bytes.Length == 0 && bytes[0] == Rlp.OfEmptySequence[0])
        return new ReceiptsMessage(null);
    ...
}

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА: V3106 рд╕рдВрднрд╡рддрдГ рд╕реВрдЪрдХрд╛рдВрдХ рдмрд╛рдзреНрдп рд╣реИред '0' рдЗрдВрдбреЗрдХреНрд╕ 'рдмрд╛рдЗрдЯреНрд╕' рдмрд╛рдЙрдВрдб рд╕реЗ рдкрд░реЗ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред Nethermind.Network рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИрдореЗрд╕реЗрдЬрд╝рд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ .cs 50

рддреНрд░реБрдЯрд┐ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрдм рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 0. рд╣реЛрддреА рд╣реИред рддрдм рдмрд╛рдЗрдЯреНрд╕ .Length == 0 рд╕реНрдерд┐рддрд┐ рд╕рд╣реА рд╣реЛрдЧреА рдФрд░ рдкреНрд░рдХрд╛рд░ 0 рдХреА рдПрдХ indexOutffRangeException рд╕рд░рдгреА рддрддреНрд╡ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рдлреЗрдВрдХ рджреА рдЬрд╛рдПрдЧреА ред

рд╡реЗ рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рддреБрд░рдВрдд рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдпрджрд┐ рд╕рд░рдгреА рдЦрд╛рд▓реА рд╣реИ рдпрд╛ 0 рддрддреНрд╡ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЧрд▓рддреА рд╕реЗ рдорд┐рд╢реНрд░рд┐рдд рд╣реИрдВ "" || рд╕рд╛рде рдореЗрдВ "&&"ред рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ:

public ReceiptsMessage Deserialize(byte[] bytes)
{
    if (bytes.Length == 0 || bytes[0] == Rlp.OfEmptySequence[0])
        return new ReceiptsMessage(null);
    ...
}

рд╢рд░реНрдд реи

public void DiscoverAll()
{
    ...
    Type? GetStepType(Type[] typesInGroup)
    {
        Type? GetStepTypeRecursive(Type? contextType)
        {
            ...
        }
        ...
        return typesInGroup.Length == 0 ? typesInGroup[0] :
               GetStepTypeRecursive(_context.GetType());
    }
    ...
}

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА: V3106 рд╕рдВрднрд╡рддрдГ рд╕реВрдЪрдХрд╛рдВрдХ рдмрд╛рдзреНрдп рд╣реИред '0' рдЗрдВрдбреЗрдХреНрд╕ 'рдЯрд╛рдЗрдкрдЗрдирдЧреНрд░реБрдк' рдмрд╛рдЙрдВрдб рд╕реЗ рдкрд░реЗ рдЗрд╢рд╛рд░рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред Nethermind.Runner EthereumStepsManager.cs 70

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдПрдХ рдХреЗ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред рдпрджрд┐ typeInGroup рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ 0 рддрддреНрд╡ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░, IndexOutOfRangeException рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред

рдХреЗрд╡рд▓ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп, рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, InGGroup [0] рдЖрдкрдХреЛ рдЕрд╢рдХреНрдд рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

рддреНрд░реБрдЯрд┐ рдпрд╛ рдЕрдзреВрд░рд╛ рдЕрдиреБрдХреВрд▓рди?


private void DeleteBlocks(Keccak deletePointer)
{
   ...
   if (currentLevel.BlockInfos.Length == 1)
   {
      shouldRemoveLevel = true;
   }
   else
   {
      for (int i = 0; i < currentLevel.BlockInfos.Length; i++)
      {
         if (currentLevel.BlockInfos[0].BlockHash == currentHash) // <=
         {
            currentLevel.BlockInfos = currentLevel.BlockInfos
                                      .Where(bi => bi.BlockHash != currentHash)
                                      .ToArray();
            break;
         }
      }
   }
   ...
}

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА: рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕реНрдерд┐рд░ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ 'currentLevel.BlockInfos' рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрддреНрд╡ рддрдХ рд╡реА 3102 рд╕рдВрджрд┐рдЧреНрдз рдкрд╣реБрдВрдЪред Nethermind.Blockchain BlockTree.cs 895

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рд▓реВрдк currentLevel.BlockInfos рддрддреНрд╡реЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИ , рд▓реЗрдХрд┐рди рдЬрдм currentLevel .BlockInfos [i] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЙрдиреНрд╣реЛрдВрдиреЗ currentLevel.BlockInfos [0] рд▓рд┐рдЦрд╛ рд╣реИ ред рд╣рдо i рдХреЛ 0 рдкрд░ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдорд┐рд╢рди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрд▓реНрджреА рдордд рдХрд░реЛ, рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдУред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдерд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓рд╛рдЗрдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓рдиреЗ / рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ , рд▓реЗрдХрд┐рди рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ред рдЕрдм, рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрдм рд╕реНрдерд┐рддрд┐ рдЭреВрдареА рд╣реИ, рддреЛ рд╣рдо рдЕрд░реНрдерд╣реАрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

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

private void DeleteBlocks(Keccak deletePointer)
{
    ...
    if (currentLevel.BlockInfos.Length == 1)
    {
        shouldRemoveLevel = true;
    }
    else
    {
        currentLevel.BlockInfos = currentLevel.BlockInfos
                                  .Where(bi => bi.BlockHash != currentHash)
                                  .ToArray();
    }
    ...
}

Dereferencing рдирд▓ рд╕рдВрджрд░реНрдн


рдбреЗрд░реЗрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рез

public void Sign(Transaction tx, int chainId)
{
    if (_logger.IsDebug)
        _logger?.Debug($"Signing transaction: {tx.Value} to {tx.To}");
    IBasicWallet.Sign(this, tx, chainId);
}

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3095 рдирд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рддреНрдпрд╛рдкрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ '_logger' рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЪреЗрдХ рд▓рд╛рдЗрдиреЗрдВ: 118, 118. рдиреЗрдерд░рдорд┐рдВрдб.рд╡реЗрд▓рд▓реЗрдЯ рджреЗрд╡рдХреАрд╕реНрдЯреЛрд░рд╡реЗрд▓рд▓реЗрдЯ.рдХреЗ 118

рдЧрд▓рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рддреНрд░реБрдЯрд┐ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ _logger.IsDebug рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреАрд▓ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА _logger null рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ ред рддрджрдиреБрд╕рд╛рд░, рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рдореЗрдВ _logger рд╣реИ рдЕрд╢рдХреНрдд , рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓ NullReferenceException ред

рдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ реи

private void BuildNodeInfo()
{
    _nodeInfo = new NodeInfo();
    _nodeInfo.Name = ClientVersion.Description;
    _nodeInfo.Enode = _enode.Info;                           // <=
    byte[] publicKeyBytes = _enode?.PublicKey?.Bytes;        // <=
    _nodeInfo.Id = (publicKeyBytes == null ? Keccak.Zero :
                   Keccak.Compute(publicKeyBytes)).ToString(false);
    _nodeInfo.Ip = _enode?.HostIp?.ToString();
    _nodeInfo.ListenAddress = $"{_enode.HostIp}:{_enode.Port}";
    _nodeInfo.Ports.Discovery = _networkConfig.DiscoveryPort;
    _nodeInfo.Ports.Listener = _networkConfig.P2PPort;
    UpdateEthProtocolInfo();
}

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3095 рдирд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рддреНрдпрд╛рдкрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ '_enode' рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрд╛рдБрдЪ рд▓рд╛рдЗрдиреЗрдВ: 55, 56. Nethermind.JsonRpc AdminModule.cs 55

рддреНрд░реБрдЯрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░ рдЕрдкрд░рд╛рдзреА _enode рд╣реИ ред

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

рд╣рдорд╛рд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ


рдорд╛рдорд▓рд╛ рдПрдХ

public static bool Equals(ref UInt256 a, ref UInt256 b)
{
    return a.s0 == b.s0 && a.s1 == b.s1 && a.s2 == b.s2 && a.s2 == b.s2;
}

рдкреА рд╡реА рдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА: V3001 рд╕рдорд░реВрдк рдЙрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 'a.s2 == b.s2' рдмрд╛рдИрдВ рдУрд░ рдФрд░ '&&' рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВред Nethermind.Dirichlet.Numerics UInt256.cs 1154

рдпрд╣рд╛рдВ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЛ 2 рдмрд╛рд░ рдЬрд╛рдВрдЪрд╛ рдЧрдпрд╛ рд╣реИ:

a.s2 == b.s2

рдЪреВрдВрдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ a рдФрд░ b рдореЗрдВ рдлрд╝реАрд▓реНрдб s3 рд╣реИ , рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдмрд╕ s2 рдХреЛ s3 рдореЗрдВ рдмрджрд▓рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ ред

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

рд╡реИрд╕реЗ, рддреБрд▓рдирд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╣реЛрддреА рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░, рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдорд╛рдирддреЗ рд╣реБрдП, рдЙрдирдХреЗ рд▓реЗрдЦрди рд╕реЗ рдмрд╣реБрдд рд╣реА рд▓рд╛рдкрд░рд╡рд╛рд╣реА рдФрд░ рдЕрд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рд╕рдмреВрдд ред рдпрд╣ рдЬрд╛рдирдХрд░, рдЕрдм рд╕рд╛рд╡рдзрд╛рди рд╣реЛ рдЬрд╛рдЗрдП :)!

рдХреЗрд╕ 2

public async Task<ApiResponse> 
PublishBlockAsync(SignedBeaconBlock signedBlock,
                  CancellationToken cancellationToken)
{
    bool acceptedLocally = false;
    ...
    if (acceptedLocally)
    {
        return new ApiResponse(StatusCode.Success);
    }
    else
    {
        return new ApiResponse(StatusCode.Success);
    }
    ...
}

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3004 'рддрддреНрдХрд╛рд▓реАрди' рдХрдерди 'рдФрд░' рдХрдерди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред Nethermind.BeaconNode BeaconNodeFacade.cs 177 рд╕реНрд╡реАрдХреГрдд

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

рдХреЗрд╕ 3

public void TearDown()
{
    ...
    foreach (var testResult in _results)
    {
         string message = $"{testResult.Order}. {testResult.Name} has " 
               + $"{(testResult.Passed ? "passed [+]" : "failed [-]")}";
         if (testResult.Passed)
         {
               TestContext.WriteLine(message);
         }
         else
         {
               TestContext.WriteLine(message);
         }
     }
}

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3004 'рддрддреНрдХрд╛рд▓реАрди' рдХрдерди 'рдФрд░' рдХрдерди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред Nethermind.Overseer.Test TestBuilder.cs 46

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

рдХреЗрд╕ 4

public void Setup()
{
    if (_decoderBuffer.ReadableBytes > 0)
    {
        throw new Exception("decoder buffer");
    }

    if (_decoderBuffer.ReadableBytes > 0)
    {
        throw new Exception("decoder buffer");
    }
    ...
}

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3021 рд╕рдорд╛рди рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ 'рдпрджрд┐' рдХрдерди рд╣реИрдВред рдкрд╣рд▓реЗ 'if' рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдореЗрдердб рд░рд┐рдЯрд░реНрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ 'рдЕрдЧрд░' рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╕рдВрд╡реЗрджрдирд╣реАрди рд╣реИ Nethermind.Network.Benchmark InFlowBenchmarks.cs 55

рдмрд╕ рдлрд┐рд░ рд╕реЗ Ctrl + V рдорд╛рд░рд╛ ред рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рдЕрдиреНрдп рд╣рд╛рд▓рдд рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдереЗ, рддреЛ рд╣рд░ рдХрд┐рд╕реА рд╕реЗ рдПрдХ рдореЗрдВ рд▓рд┐рдЦрддреЗ рдереЗ рд╣реВрдБ рдЕрдЧрд░ рддрд╛рд░реНрдХрд┐рдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореИрдВ

рдкреНрд░рдХрд░рдг 5

private void LogBlockAuthorNicely(Block block, ISyncPeer syncPeer)
{
    if (_logger.IsInfo)
    {
        if (_logger.IsInfo)
        {
            ...
        }
    }
}

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V3030 рдЖрд╡рд░реНрддреА рдЬрд╛рдБрдЪред '_Logger.IsInfo' рдХреА рд╕реНрдерд┐рддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 242 рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХреА рдЧрдИ рдереАред Nethermind.Synchronization SyncServer.cs 244

рдЪреМрдереЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ _logger рдХреЗ рдкрд╛рд╕ рди рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ' рдмреВрд▓ рдЗрдЬрд╝рд░рд░ {рдорд┐рд▓; } 'ред рдЗрд╕рд▓рд┐рдП, рдХреЛрдб рдХреЛ рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

private void LogBlockAuthorNicely(Block block, ISyncPeer syncPeer)
{
    if (_logger.IsInfo)
    {
        if (!_logger.IsError) // <=
        {
            ...
        }
    }
}

рдЦреИрд░, рдпрд╛ рдХреЛрдб рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рднреА рджреЛрд╖ рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЪреЗрдХ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдХреЗрд╕ 6

if (missingParamsCount != 0)
{
    bool incorrectParametersCount = missingParamsCount != 0; // <=
    if (missingParamsCount > 0)
    {
        ...
    }
    ...
}

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА : V3022 рдПрдХреНрд╕рдкреНрд░реЗрд╢рди 'рд▓рд╛рдкрддрд╛рдкреНрд░реЗрдордХрд╛рдЙрдВрдЯ! = 0' рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛрддрд╛ рд╣реИред Nethermind.JsonRpc JsonRpcService.cs 127

рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ (рдЕрдиреБрдкрд▓рдмреНрдзParamsCount! = 0) рдФрд░ рдпрджрд┐ рдпрд╣ рд╕рддреНрдп рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдЪрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдЪ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдХрд╛рдлреА рдореВрд▓ рддрд░реАрдХрд╛ рд╣реИред

рднреНрд░рд╛рдордХ рдЬрд╛рдБрдЪ


public async Task<long> 
DownloadHeaders(PeerInfo bestPeer, 
                BlocksRequest blocksRequest, 
                CancellationToken cancellation)
{
  ...
  for (int i = 1; i < headers.Length; i++)
  {
    ...
    BlockHeader currentHeader = headers[i];
    ...
    bool isValid = i > 1 ? 
        _blockValidator.ValidateHeader(currentHeader, headers[i - 1], false):
        _blockValidator.ValidateHeader(currentHeader, false);
    ...
    if (HandleAddResult(bestPeer, 
                        currentHeader, 
                        i == 0,                              // <=
                        _blockTree.Insert(currentHeader))) 
    {
       headersSynced++;
    }

    ...
  }
  ...
}

PVS-Studio рдЪреЗрддрд╛рд╡рдиреА : V3022 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 'i == 0' рд╣рдореЗрд╢рд╛ рдЭреВрдареА рд╣реЛрддреА рд╣реИред Nethermind.Synchronization BlockDownloader.cs 192

рдЪрд▓рд┐рдП рдХреНрд░рдо рдореЗрдВ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╕рдордп, рдЪрд░ I рдХреЛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдЪрд░ рдХреЗрд╡рд▓ рдмрдврд╝рд╛ рд╣реБрдЖ рд╣реИ; рдЗрд╕рд▓рд┐рдП, рдорд╛рди рд╣рдореЗрд╢рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЧрд▓рдд рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ ред

рдЕрдм рд╣рдо рд╣реИрдВрдбрд▓ рджреЗрдЦреЗрдВ :

private bool HandleAddResult(PeerInfo peerInfo, 
                             BlockHeader block,
                             bool isFirstInBatch, 
                             AddBlockResult addResult)
{
    ...
    if (isFirstInBatch)
    {
        ...
    }
    else
    {
        ...
    }
    ...
}

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

BlockHeader currentHeader = headers[i];
_blockValidator.ValidateHeader(currentHeader, headers[i - 1], false)

рдордд рднреВрд▓рдирд╛ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрд▓рдЯреА рдЧрд┐рдирддреА 1. рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо 2 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: рдпрд╛ рддреЛ "рдкрд╣рд▓реЗ" рдХрд╛ рдЕрд░реНрде рд╕реВрдЪрдХрд╛рдВрдХ 1 рдХреЗ рддрд╣рдд рдПрдХ рддрддреНрд╡, рдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ 0. рдХреЗ рддрд╣рдд рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ рдореИрдВ ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

HandleAddResult(bestPeer, currentHeader, 
                i == 1, _blockTree.Insert(currentHeader))

рдпрд╛ рдЗрд╕ рддрд░рд╣:

HandleAddResult(bestPeer, currentHeader, 
                i - 1 == 0, _blockTree.Insert(currentHeader))

рдФрд░ рдлрд┐рд░, рдпрджрд┐ рдХреЛрдИ рдбреЗрд╡рд▓рдкрд░ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦреЗрдЧрд╛ рдФрд░ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЦреЗрдЧрд╛, рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЬреАрд╡рди рдХрд╛ рдЖрдирдВрдж рд▓реЗрдЧрд╛ред

рдкреНрд░рд╛рдердорд┐рдХреНрддрд╛ ??


рд╕реНрдерд┐рддрд┐ 1

public int MemorySize
{
  get
  {
    int unaligned = (Keccak == null ? MemorySizes.RefSize : 
        MemorySizes.RefSize + Keccak.MemorySize) 
        + (MemorySizes.RefSize + FullRlp?.Length 
                                 ?? MemorySizes.ArrayOverhead)   // <=
        + (MemorySizes.RefSize + _rlpStream?.MemorySize 
                                 ?? MemorySizes.RefSize)         // <=
        + MemorySizes.RefSize + (MemorySizes.ArrayOverhead + _data?.Length 
        * MemorySizes.RefSize ?? MemorySizes.ArrayOverhead) 
        + MemorySizes.SmallObjectOverhead + (Key?.MemorySize ?? 0);
    return MemorySizes.Align(unaligned);
  }
}

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

  • V3123 рд╢рд╛рдпрдж '??' рдСрдкрд░реЗрдЯрд░ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЗрд╕рдХреЗ рдмрд╛рдПрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реЗ рдХрдо рд╣реИред Nethermind.Trie TrieNode.cs 43
  • V3123 рд╢рд╛рдпрдж '??' рдСрдкрд░реЗрдЯрд░ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЗрд╕рдХреЗ рдмрд╛рдПрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реЗ рдХрдо рд╣реИред Nethermind.Trie TrieNode.cs 44

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╣рдо "??" рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рд╣рдо рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдпрд╣рд╛рдБ рджреЗрдЦрддреЗ рд╣реИрдВ:

(MemorySizes.RefSize + FullRlp?.Length ?? MemorySizes.ArrayOverhead)

MemorySizes.RefSize рдФрд░ MemorySizes.ArrayOverhead рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ:

public static class MemorySizes
{
    ...
    public const int RefSize = 8;
    public const int ArrayOverhead = 20;
    ...
}

рдЗрд╕рд▓рд┐рдП, рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:

(8 + FullRlp?.Length ?? 20)

рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП FullRlp рд╣реИ рдЕрд╢рдХреНрддред рддрдм (8 + рдирд▓) рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ ред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдкреНрд░рд╛рдкреНрдд рдЕрд╢рдХреНрдд ?? 20 ) рд╣реИ, рдЬреЛ 20 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА

, рдмрд╢рд░реНрддреЗ рдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐, FullRlp рд╣реИ рдЕрд╢рдХреНрдд , рд╕реЗ рдореВрд▓реНрдп MemorySizes.ArrayOverhead рд╣рдореЗрд╢рд╛ рд▓реМрдЯрд╛ рджреА рдЬрд╛рдПрдЧреА рдХреНрдпрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рд╣реИ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ MemorySizes.RefSizeред рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рдкрд░ рдЯреБрдХрдбрд╝рд╛ рд╕рдорд╛рди рд╣реИред

рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рд┐рдП рдерд╛? рдЖрдЗрдП рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдХреЛ рджреЗрдЦреЗрдВ:

MemorySizes.RefSize + (MemorySizes.ArrayOverhead 
    + _data?.Length * MemorySizes.RefSize ?? MemorySizes.ArrayOverhead) 

рдпрд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЦрдВрдбреЛрдВ рдореЗрдВ рд╣реИ, MemorySize.RefSize рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓реЗ "+" рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рдж рдПрдХ рдмреНрд░реИрдХреЗрдЯ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ MemorySizes.RefSize рдореЗрдВ рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рдпрд╣ рдЕрд╢рдХреНрдд рд╣реИ , рддреЛ рд╣рдо рдПрдХ рдФрд░ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рддреЛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

public int MemorySize
{
  get
  {
    int unaligned = (Keccak == null ? MemorySizes.RefSize : 
       MemorySizes.RefSize + Keccak.MemorySize) 
       + (MemorySizes.RefSize + (FullRlp?.Length 
                                 ?? MemorySizes.ArrayOverhead))    // <=
       + (MemorySizes.RefSize + (_rlpStream?.MemorySize 
                                 ?? MemorySizes.RefSize))          // <=
       + MemorySizes.RefSize + (MemorySizes.ArrayOverhead + _data?.Length 
       * MemorySizes.RefSize ?? MemorySizes.ArrayOverhead) 
       + MemorySizes.SmallObjectOverhead + (Key?.MemorySize ?? 0);
    return MemorySizes.Align(unaligned);
  }
}

рдлрд┐рд░, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рд░рдгрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рддрд╛ рдерд╛, рддреЛ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП:

((MemorySizes.RefSize + FullRlp?.Length) ?? MemorySizes.ArrayOverhead)

рдФрд░ рдлрд┐рд░, рдЬреЛ рдЗрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдЙрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

рд╕реНрдерд┐рддрд┐ 2

private async Task<JsonRpcResponse> 
ExecuteAsync(JsonRpcRequest request, 
             string methodName,
             (MethodInfo Info, bool ReadOnly) method)
{
    var expectedParameters = method.Info.GetParameters();
    var providedParameters = request.Params;
    ...
    int missingParamsCount = expectedParameters.Length 
            - (providedParameters?.Length ?? 0) 
            + providedParameters?.Count(string.IsNullOrWhiteSpace) ?? 0; // <=
    if (missingParamsCount != 0)
    {
        ...
    }
    ...
}

PVS- рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪреЗрддрд╛рд╡рдиреА: V3123 рд╢рд╛рдпрдж '??' рдСрдкрд░реЗрдЯрд░ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЗрд╕рдХреЗ рдмрд╛рдПрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реЗ рдХрдо рд╣реИред Nethermind.JsonRpc JsonRpcService.cs 123

рдФрд░ рдлрд┐рд░ рд╕реЗ, рдСрдкрд░реЗрд╢рди рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ "??" рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЕрдВрддрд┐рдо рд╕рдордп рдореЗрдВ, рд╣рдо рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдпрд╣рд╛рдБ рджреЗрдЦрддреЗ рд╣реИрдВ:

expectedParameters.Length 
            - (providedParameters?.Length ?? 0) 
            + providedParameters?.Count(string.IsNullOrWhiteSpace) ?? 0;

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ providedParameters рд╣реИ рдЕрд╢рдХреНрдд , рддреЛ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рддреБрд░рдВрдд рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдм рдХреБрдЫ рдмрджрд▓рдиреЗ рдХреЗ providedParameters рд╕рд╛рде рдЕрд╢рдХреНрдд, рдФрд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореВрд▓реНрдп рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХреЗ рдмрдЬрд╛рдп expectedParameters.Length :

100 - (null ?? 0) + null ?? 0;

рдЕрдм рдпрд╣ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рджреЛ рд╕рдорд╛рди рдЪреЗрдХ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрд╖реНрдардХ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ ( рд╢реВрдиреНрдп ?? 0 ) 0 рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛, рдлрд┐рд░ 0 рдХреЛ 100 рд╕реЗ рдШрдЯрд╛рдПрдВ рдФрд░ 100 рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

100 + null ?? 0;

рдЕрдм, рдкрд╣рд▓реЗ " null ?? 0 " рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрдВрдд рдореЗрдВ ( 100 + 0 ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп , рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ ( 100 + null ) рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рд╢реВрдиреНрдп рдорд┐рд▓реЗрдЧрд╛ ред рдлрд┐рд░ рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ ( рд╢реВрдиреНрдп ?? 0 ), рдЬреЛ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓рд╛рдкрддрд╛рдкреНрд░реЗрдордХрд╛рдЙрдВрдЯ рдЪрд░ рдХрд╛ рдорд╛рди 0. рд╣реЛрдЧрд╛ред

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

рдФрд░ рдлрд┐рд░, рд╣рдо рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдордиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред

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


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

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

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



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

All Articles