
рдирдорд╕реНрддреЗ, рдЖрдк рд╕рднреА рд╡рд┐рджреЗрд╢реА рдФрд░ рд╕рд╛рджреЗ рдХреАрдбрд╝реЗ рдХреЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЗрдХрдЯреНрдард╛ рд╣реЛрддреЗ рд╣реИрдВ! рд╣рдореЗрдВ рдЖрдЬ рдЕрдкрдиреЗ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЯреЗрд╕реНрдЯ рдмреЗрдВрдЪ рдкрд░ рдПрдХ рджреБрд░реНрд▓рдн рдирдореВрдирд╛ рдорд┐рд▓рд╛ рд╣реИ - рдПрдХ рдЧреЗрдо рдЬрд┐рд╕реЗ "рдУрд╢реБ!" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реА # рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдмрдЧ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ, рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЦреЗрд▓реЗрдВрдЧреЗред
рдЦреЗрд▓
Osu! рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рд░рд┐рджрдо рдЧреЗрдо рд╣реИред рдЧреЗрдо рдХреА
рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 15 рдорд┐рд▓рд┐рдпрди рд╕реЗ рдЕрдзрд┐рдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдЦрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореБрдлреНрдд рдЧреЗрдордкреНрд▓реЗ, рд░рдВрдЧреАрди рдбрд┐рдЬрд╝рд╛рдЗрди, рдорд╛рдирдЪрд┐рддреНрд░ рдЕрдиреБрдХреВрд▓рди, рдПрдХ рдЙрдиреНрдирдд рдСрдирд▓рд╛рдЗрди рдкреНрд▓реЗрдпрд░ рд░реИрдВрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо, рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░ рдореЛрдб рдФрд░ рд╕рдВрдЧреАрдд рдХреЗ рдПрдХ рд╕рдореГрджреНрдз рд╕реЗрдЯ рдХреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИред рдЦреЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ; рдЖрдк рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдкреГрд╖реНрда рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред
рдореБрдЭреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдЬреЛ
GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рддреБрд░рдВрдд рдкрдХрдбрд╝ рд▓реЗрддреА рд╣реИ рд╡рд╣ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрдорд┐рдЯ (24 рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ) рд╣реИ, рдЬреЛ рдЧрд╣рди, рдЪрд▓ рд░рд╣реЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ (рдЦреЗрд▓ рдкрд╣рд▓реА рдмрд╛рд░ 2007 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХрд╛рдо рдкрд╣рд▓реЗ рднреА рд╢реБрд░реВ рд╣реЛ рдЪреБрдХрд╛ рд╣реЛрдЧрд╛)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИ: рдХреЗрд╡рд▓ резрейрезрей .cs рдлрд╛рдЗрд▓реЗрдВ рдХреБрд▓ резрейрел рд╣рдЬрд╛рд░ рдЧреИрд░-рдЦрд╛рд▓реА рдПрд▓рдУрд╕реА рд╣реИрдВред рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЪреЗрдХ рдЪрд▓рд╛рддреЗ рд╕рдордп рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реВрдВред рдкрд░реАрдХреНрд╖рдг 25 рд╣рдЬрд╛рд░ LOC рдХреЗ рд╕рд╛рде .cs рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА 306 рдмрдирд╛рддреЗ рд╣реИрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЫреЛрдЯреА рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рд╕реА # рдХреЛрд░ рд▓рдЧрднрдЧ 300 рд╣рдЬрд╛рд░ рдПрд▓рдУрд╕реА рд▓рдВрдмрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдореИрдВрдиреЗ 1507 рдлрд╛рдЗрд▓реЗрдВ 110 рд╣рдЬрд╛рд░ рдПрд▓рдУрд╕реА рд▓рдВрдмреА рдЬрд╛рдБрдЪ рдХреАред рдЪреЗрдХ рдиреЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдмрдЧ рдкреНрд░рдХрдЯ рдХрд┐рдП, рдЬреЛ рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред
рдХреАрдбрд╝реЗ
V3001 рд╕рдорд╛рди рдЙрдк-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ 'рдкрд░рд┐рдгрд╛рдо == HitResult.Perfect' рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ '' рдСрдкрд░реЗрдЯрд░ред рдбреНрд░рд╛рдПрдмрд▓рд╣реЛрд▓реНрдбрдиреЛрдЯред 266
protected override void CheckForResult(....) { .... ApplyResult(r => { if (holdNote.hasBroken && (result == HitResult.Perfect || result == HitResult.Perfect)) result = HitResult.Good; .... }); }
рдпрд╣ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдХрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореЗрд░реЗ рд╕рд╣рдХрд░реНрдореА рд╡реЗрд▓реЗрд░реА рдХреЛрдорд╛рд░реЛрд╡ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рд▓реЗрдЦ "
2019 рдореЗрдВ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╢реАрд░реНрд╖ 10 рдХреАрдбрд╝реЗ рдорд┐рд▓рд╛ " рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рд╡рд┐рдиреЛрджреА рд╢рдмреНрдж рд╣реИред
рд╡реИрд╕реЗ рднреА, рджреЛ рд╕рдорд╛рди рдЪреЗрдХ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╢рд╛рдпрдж
HitResult рдЧрдгрди рдХреЗ рдХреБрдЫ рдЕрдиреНрдп рдирд┐рд░рдВрддрд░ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛:
public enum HitResult { None, Miss, Meh, Ok, Good, Great, Perfect, }
рдХрд┐рд╕ рдХрдиреНрдЯреЗрд╕реНрдЯреЗрдВрдЯ рдХреЛ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛? рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реА рдЬрд╛рдБрдЪ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдпреЗ рдРрд╕реЗ рд╕рд╡рд╛рд▓ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЬрд╡рд╛рдм рдХреЗрд╡рд▓ рд▓реЗрдЦрдХ рд╣реА рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╡реИрд╕реЗ рднреА, рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рддрд░реНрдХ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рддрд╛ рд╣реИред
V3001 рд╕рдорд╛рди рдЙрдк-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ 'рдкрд░рд┐рд╡рд╛рд░! = GetFamilyString (TournamentTypeface.Aquatico)' рдмрд╛рдИрдВ рдУрд░ рдФрд░ '&&' рдСрдкрд░реЗрдЯрд░ рдХреЗ рджрд╛рдИрдВ рдУрд░ред рдЯреВрд░реНрдирд╛рдореЗрдВрдЯрдлреЛрдВрдЯ.рдХреЗ 64
public static string GetWeightString(string family, FontWeight weight) { .... if (weight == FontWeight.Regular && family != GetFamilyString(TournamentTypeface.Aquatico) && family != GetFamilyString(TournamentTypeface.Aquatico)) weightString = string.Empty; .... }
рдлрд┐рд░ рд╕реЗ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░реЗрдВред рдореИрдВрдиреЗ рдХреЛрдб рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЧрд▓рддреА рдЕрдм рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣, рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЯреВрд░реНрдирд╛рдореЗрдВрдЯ рдЯреВрд░реНрдирд╛рдореЗрдВрдЯ рдкреНрд░рдЪрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрддрд╛ рд╣реИ:
public enum TournamentTypeface { Aquatico }
рд╢рд╛рдпрдж рдЧрд▓рддреА рджреЛ рдмрд╛рд░
рдкрд░рд┐рд╡рд╛рд░ рдЪрд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
V3009 [CWE-393] рдпрд╣ рд╡рд┐рдЪрд┐рддреНрд░ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдПрдХ рдФрд░ 'рд╕рдорд╛рди' рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИред KeyCounterAction.cs 19
public bool OnPressed(T action, bool forwards) { if (!EqualityComparer<T>.Default.Equals(action, Action)) return false; IsLit = true; if (forwards) Increment(); return false; }
рдпрд╣ рд╡рд┐рдзрд┐ рд╣рд░ рдмрд╛рд░
рдЭреВрдареА рд╣реЛрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрдХреНрд╕рд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЙрд▓рд░ рд░рд┐рдЯрд░реНрди рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ (рдЦрд░рд╛рдм рд╢реИрд▓реА рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЙрд▓ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
public bool OnPressed(T action) => Target.Children .OfType<KeyCounterAction<T>>() .Any(c => c.OnPressed(action, Clock.Rate >= 0));
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЙрд▓рд░
рдСрдирдкреЗрдб рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рд╡рд╣ рдорд╛рди рд╣рдореЗрд╢рд╛
рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЦреБрдж рднреА рд╣рдореЗрд╢рд╛
рдЭреВрда рдмреЛрд▓рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЧрд▓рддреА рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдФрд░ рд╕рдорд╛рди рдмрдЧ:
- V3009 [CWE-393] рдпрд╣ рд╡рд┐рдЪрд┐рддреНрд░ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдПрдХ рдФрд░ 'рд╕рдорд╛рди' рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИред KeyCounterAction.cs 30
V3042 [CWE-476] рд╕рдВрднрд╛рд╡рд┐рдд NullReferenceExceptionред '?' рдФрд░ '' рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ 'val.NewValue' рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреВрд░реНрдирд╛рдореЗрдВрдЯ рдЯреВрд░реНрдирд╛рдореЗрдВрдЯ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 41
public TournamentTeam() { Acronym.ValueChanged += val => { if (....) FlagName.Value = val.NewValue.Length >= 2
Val.NewValue рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЦрддрд░рдирд╛рдХ рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
?: рдСрдкрд░реЗрдЯрд░ред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреНрдпрд╛ рд╕реЛрдЪрддрд╛ рд╣реИ, рдпрд╣ рддрдереНрдп рд╣реИ рдХрд┐ рдмрд╛рдж рдореЗрдВ
рддрддреНрдХрд╛рд▓реАрди рд╢рд╛рдЦрд╛ рдореЗрдВ, рдЙрд╕реА рдЪрд░ рдХреЛ рд╕рд╢рд░реНрдд рдкрд╣реБрдВрдЪ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
val.NewValue .Substring (....) ред
рдПрдХ рдФрд░ рд╕рдорд╛рди рдмрдЧ:
- V3042 [CWE-476] рд╕рдВрднрд╛рд╡рд┐рдд NullReferenceExceptionред '?' рдФрд░ '' рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ 'val.NewValue' рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреВрд░реНрдирд╛рдореЗрдВрдЯ рдЯреВрд░реНрдирд╛рдореЗрдВрдЯ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 48
V3042 [CWE-476] рд╕рдВрднрд╛рд╡рд┐рдд NullReferenceExceptionред '?' рдФрд░ '' рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ 'рдПрдкреАрдЖрдИ' рдСрдмреНрдЬреЗрдХреНрдЯ SetupScreen.cs 77 рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
private void reload() { .... new ActionableInfo { Label = "Current User", ButtonText = "Change Login", Action = () => { api.Logout();
рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рднреА рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░
ActionableInfo рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
рдПрдХреНрд╢рди рдлрд╝реАрд▓реНрдб рдХреЛ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЦрддрд░рдирд╛рдХ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн
рдПрдкреА рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд╛рдирддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐
рдПрдкреА рдЪрд░ рдХреЛ рдмрд╛рдж рдореЗрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм
рдореВрд▓реНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдХрд╣рд╛, рдХреНрдпреЛрдВрдХрд┐ рд▓рдВрдмреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдб рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рджреЗрд░реА, рдЬрд┐рд╕рдХреЗ
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдбреЗрд╡рд▓рдкрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐
рдПрдкреАрдЖрдИ рд╕рдВрджрд░реНрдн рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реИрдВрдмрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╢рд░реАрд░ рдХрд┐рд╕реА рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрджрд░реНрдн рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдкреВрд░реНрд╡ рдЪреЗрдХред
V3066 [CWE-683] 'Atan2' рд╡рд┐рдзрд┐: 'diff.X' рдФрд░ 'diff.Y' рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд▓рдд рдХреНрд░рдоред SliderBall.cs 182
public void UpdateProgress(double completionProgress) { .... Rotation = -90 + (float)(-Math.Atan2(diff.X, diff.Y) * 180 / Math.PI); .... }
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐
рдЕрддрди 2 рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХ рдЧрд▓рдд рдХреНрд░рдо рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ:
рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рдХреНрдпреЛрдВрдХрд┐
UpdateProgress рд╡рд┐рдзрд┐ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЧрдгрдирд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ; рдореИрдВ рдмрд╕ рдЗрд╕реЗ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдмрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
V3080 [CWE-476] рд╕рдВрднрд╛рд╡рд┐рдд
рдЕрд╢рд╛рдВрддрд┐ ред 'рдмреАрдЯрдореИрдк' рдХреЗ рдирд┐рд░реАрдХреНрд╖рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╡рд░реНрдХрдмреАрдЯрдореИрдк .cs 57
protected virtual Track GetVirtualTrack() { .... var lastObject = Beatmap.HitObjects.LastOrDefault(); .... }
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ
рдмреАрдЯрдореИрдк рдХреЗ
рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рдХреНрддрддрд╛ рдХреЛ
рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ :
public IBeatmap Beatmap { get { try { return LoadBeatmapAsync().Result; } catch (TaskCanceledException) { return null; } } }
рдЦреИрд░, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕рд╣реА рд╣реИред
рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЗрд╕ рддрд░рд╣ рдмрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдФрд░ C # 8.0 рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдирдП рдлреАрдЪрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдЦ "
C # 8.0 рдФрд░ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ " рджреЗрдЦреЗрдВред
V3083 [CWE-367] 'рдСрдмреНрдЬреЗрдХреНрдЯрдХреЙрдирд╡рд░реНрдЯреЗрдб' рдЗрд╡реЗрдВрдЯ рдХрд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЗрдирд╡реЙрдЗрд╕, NullReferenceException рд╕рдВрднрд╡ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЛ рдШрдЯрдирд╛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдмреАрдЯрдореИрдкрдХреЙрд░реНрдЯрд░
private List<T> convertHitObjects(....) { .... if (ObjectConverted != null) { converted = converted.ToList(); ObjectConverted.Invoke(obj, converted); } .... }
рдпрд╣ рдорд╛рдореВрд▓реА рдФрд░ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реИред рдЧреНрд░рд╛рд╣рдХ рдЕрд╢рдХреНрдд рдЪреЗрдХ рдФрд░ рдИрд╡реЗрдВрдЯ рдЗрдирд╡реЛрдХреЗрд╢рди рдХреЗ рдмреАрдЪ рдИрд╡реЗрдВрдЯ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ:
private List<T> convertHitObjects(....) { .... converted = converted.ToList(); ObjectConverted?.Invoke(obj, converted); .... }
V3095 [CWE-476] рдирд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рддреНрдпрд╛рдкрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ 'рдХреЙрд▓рдо' рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЪреЗрдХ рд▓рд╛рдЗрдиреЗрдВ: 141, 142. рд╕реНрдХреНрд╡рд╛рдпрд░рдЧреНрд░рд╛рдл.рдХреИрдВрд╕ 141
private void redrawProgress() { for (int i = 0; i < ColumnCount; i++) columns[i].State = i <= progress ? ColumnState.Lit : ColumnState.Dimmed; columns?.ForceRedraw(); }
рдХреЙрд▓рдо рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдПрдХ рдЦрддрд░рдирд╛рдХ рддрд░реАрдХреЗ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдорд╛рдирд╛ рдХрд┐
рдХреЙрд▓рдо рд╕рдВрджрд░реНрдн рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХреЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЖрдЧреЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╢рд░реНрдд рдПрдХреНрд╕реЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
V3119 рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдШрдЯрдирд╛ 'OnNewResult' рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдИрд╡реЗрдВрдЯ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдпрд╛ 'рд╕реАрд▓' рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред DrawableRuleset.cs 256
private void addHitObject(TObject hitObject) { .... drawableObject.OnNewResult += (_, r) => OnNewResult?.Invoke(r); .... } public override event Action<JudgementResult> OnNewResult;
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдУрд╡рд░рд░рд╛рдЗрдб рдпрд╛ рдЖрднрд╛рд╕реА рдШрдЯрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдиреИрджрд╛рдирд┐рдХ
рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВред рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рд▓реЗрдЦ рднреА рд▓рд┐рдЦрд╛ рд╣реИ: "
рд╕реА # рдореЗрдВ рдЖрднрд╛рд╕реА рдШрдЯрдирд╛рдПрдВ: рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ "ред
рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рд╕рдорд╛рди рдирд┐рд░реНрдорд╛рдг рд╣реИ:
- V3119 рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдб рдШрдЯрдирд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдИрд╡реЗрдВрдЯ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдпрд╛ 'рд╕реАрд▓' рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдбреНрд░рд╛рдПрдмрд▓рд░реБрд▓реНрд╕реЗрдЯред 257
V3123 [CWE-783] рд╢рд╛рдпрдж '??' рдСрдкрд░реЗрдЯрд░ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЗрд╕рдХреЗ рдмрд╛рдПрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реЗ рдХрдо рд╣реИред OsuScreenStack.cs 45
private void onScreenChange(IScreen prev, IScreen next) { parallaxContainer.ParallaxAmount = ParallaxContainer.DEFAULT_PARALLAX_AMOUNT * ((IOsuScreen)next)?.BackgroundParallaxAmount ?? 1.0f; }
рдПрдХ рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдХреЛрдб рдХреЗ рдореВрд▓ рддрд░реНрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
x = (c * a) ?? b;
рдмрдЧ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЙрдкрдЬрд╛ рд╣реИ рдХрд┐ "*" рдСрдкрд░реЗрдЯрд░ рдХреА рдкреВрд░реНрд╡рддрд╛ "??" рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдСрдкрд░реЗрдЯрд░ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рдХреЛрдб рдЬреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП (рдХреЛрд╖реНрдардХ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рд╕рд╛рде):
private void onScreenChange(IScreen prev, IScreen next) { parallaxContainer.ParallaxAmount = ParallaxContainer.DEFAULT_PARALLAX_AMOUNT * (((IOsuScreen)next)?.BackgroundParallaxAmount ?? 1.0f); }
рдПрдХ рдФрд░ рд╕рдорд╛рди рдмрдЧ:
V3123 [CWE-783] рд╢рд╛рдпрдж '??' рдСрдкрд░реЗрдЯрд░ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЗрд╕рдХреЗ рдмрд╛рдПрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реЗ рдХрдо рд╣реИред FramedReplayInputHandler.cs 103
private bool inImportantSection { get { .... return IsImportant(frame) && Math.Abs(CurrentTime - NextFrame?.Time ?? 0) <= AllowedImportantTimeSpan; } }
рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреВрд░реНрд╡рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рдзрд╛рд░рдгрд╛рдПрдВ рдереАрдВред рдореВрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
рдореИрдереНрд╕ рдореЗрдВ
рдЙрддреНрддреАрд░реНрдг рдХреА рдЧрдИ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
(a тАУ b) ?? 0
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
private bool inImportantSection { get { .... return IsImportant(frame) && Math.Abs(CurrentTime тАУ (NextFrame?.Time ?? 0)) <= AllowedImportantTimeSpan; } }
V3142 [CWE-561]
рдЕрдЧрдореНрдп рдХреЛрдб рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдореМрдЬреВрдж рд╣реЛред рдбреНрд░рд╛рдмрд▓рд╣реЛрд▓реНрдбрдиреЛрдЯреНрд╕.рдХреЗ 214
public override bool OnPressed(ManiaAction action) { if (!base.OnPressed(action)) return false; if (Result.Type == HitResult.Miss)
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐
рдСрдирдкреНрд░реЗрд╕реНрдб рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдХреЛрдб
рдЕрдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдпрджрд┐ рдХрдерди рдХреЗ рд╕рд╛рде рджреВрд╕рд░рд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ рдкрд╣рд▓реА рд╢рд░реНрдд рд╣рдореЗрд╢рд╛ рд╕рд╣реА рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдХрд┐ рдЖрдзрд╛рд░ред
рдХреЛрдИ рднреА рддрд░реАрдХрд╛ рд╣рдореЗрд╢рд╛
рдЧрд▓рдд рд╣реЛрдЧрд╛ ред рдЖрдЗрдП рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
public virtual bool OnPressed(ManiaAction action) { if (action != Action.Value) return false; return UpdateResult(true); }
рдФрд░ рдЕрдм
UpdateResult рдореЗрдердб рдкрд░:
protected bool UpdateResult(bool userTriggered) { if (Time.Elapsed < 0) return false; if (Judged) return false; .... return Judged; }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
рдЬрдЬ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдВ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рдХреНрдпреЛрдВрдХрд┐
UpdateResult рдкрджреНрдзрддрд┐ рдХрд╛ рддрд░реНрдХ рдпрд╣
рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо
рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдирд┐рдореНрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
return false;
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐
UpdateResult рд╡рд┐рдзрд┐ рд╣рд░ рд╕рдордп
рдЭреВрдареА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреИрдХ рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдЧрдореНрдп-рдХреЛрдб рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреАред
V3146 [CWE-476] 'рдирд┐рдпрдо' рдХреА рд╕рдВрднрд╛рд╡рд┐рдд
рдЕрд╢рд╛рдВрддрд┐ ред 'FirstOrDefault' рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрд╢рдХреНрдд рдорд╛рди рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред APILegacyScoreInfo.cs 24
public ScoreInfo CreateScoreInfo(RulesetStore rulesets) { var ruleset = rulesets.GetRuleset(OnlineRulesetID); var mods = Mods != null ? ruleset.CreateInstance()
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐
ruleset.CreateInstance () рдХреЙрд▓ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ,
рдЧреЗрдЯрд╕реЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк
рдирд┐рдпрдо рдЪрд░ рдХреЛ рдПрдХ рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
public RulesetInfo GetRuleset(int id) => AvailableRulesets.FirstOrDefault(....);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЪреЗрддрд╛рд╡рдиреА рдорд╛рдиреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ
FirstOrDefault рд╡рд┐рдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ
рдЕрд╢рдХреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ ред
рдирд┐рд╖реНрдХрд░реНрд╖
"Osu!" рдХреЗ рдХреЛрдб рдореЗрдВ рдХрдИ рдмрдЧ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд▓реЗрдЦрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП рдореБрджреНрджреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА рдФрд░ рдЦреЗрд▓ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд╢реА рд▓рд╛рддрд╛ рд░рд╣реЗрдЧрд╛ред
рдпрджрд┐ рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░
рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдПрдХ рдФрд░ рдмрд╛рдд рдЬреЛ рдореИрдВ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдмрд╛рд░ рдХреЗ рдЪреЗрдХ рдХрд╛ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рднрд╛рд╡реА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдмрд┐рд▓реНрдб рд╕рд░реНрд╡рд░ рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЖрдкрдХрд╛ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рдХреЛрдбрд┐рдВрдЧ рдЪрд░рдг рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкрдХрдбрд╝рдХрд░ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдлрд┐рд╕рд▓рдиреЗ рд╕реЗ рдХреАрдбрд╝реЗ рд░рдЦрдирд╛ рд╣реИред
рд╢реБрднрдХрд╛рдордирд╛рдПрдБ, рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рд░рд╣реЗрдВ!
рд╕рдВрджрд░реНрдн
рдпрд╣ 2020 рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИред рдЬрдм рд╣рдо рдЗрд╕ рдкрд░ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдБ рдкрд┐рдЫрд▓реЗ # рдкрд░ рдХреА рдЧрдИ C # рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдВрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ: