рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЗрди рдж рдХреНрд▓рд╛рдЙрдбреНрд╕ - рд░рдирд┐рдВрдЧ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕ рдСрди рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ

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

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


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

рдкреНрд░рдпреБрдХреНрдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА


рдЯреНрд░реИрд╡рд┐рд╕ CI рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдмрдирд╛рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдПрдХ рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдЯрд╣рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдХреЛ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ .travis.yml рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдЬрдбрд╝ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред

рд╣рдо рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрд▓рдПрдХреНрд╕рд╕реА (рд▓рд┐рдирдХреНрд╕ рдХрдВрдЯреЗрдирд░) рд▓реЗрдВрдЧреЗред рдпрд╣ рдПрдХ рдиреЛрдб рдкрд░ рд▓рд┐рдирдХреНрд╕ рдУрдПрд╕ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрд╢рди рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдкрд░ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рд╕рд┐рд╕реНрдЯрдо рд╣реИред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдХреНрд▓реЙрдХ рдХрдорд╛рдВрдб рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ:
рднрд╛рд╖рд╛
рдлрд╝рд╛рдЗрд▓реЗрдВ
рд░рд┐рдХреНрдд
рдЯрд┐рдкреНрдкрдгреА
рдХреЛрдб
рд╕реА
124
11937
6758
50,836
рд╕реА / рд╕реА ++ рд╣реИрдбрд░
65
1117
3676
3774
рдиреЛрдЯ: LXC рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреНрд░реИрд╡рд┐рд╕ CI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдирдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рдиреНрдпрд╛рд╕


рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ GitHub- рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧрд┐рди рдХрд░рддреЗ рд╣реИрдВред

рдЪрд┐рддреНрд░ рез 17

рдЦреБрд▓реА рдЦрд┐рдбрд╝рдХреА рдореЗрдВ рд╣рдореЗрдВ рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдХреЛ рд▓реЙрдЧрд┐рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЪрд┐рддреНрд░ 16

рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрд╡рд╛рдЧрдд рдкреГрд╖реНрда "рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣рд╛рдБ? рдЖрдк рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ! , рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдж рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ:

  • рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ;
  • рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ .travis.yml рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ;
  • рдкрд╣рд▓рд╛ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░реЗрдВред

рдЪрд┐рддреНрд░ рез 18

рдЖрдЗрдП рдЗрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред

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

рдЪрд┐рддреНрд░ рез реп

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

рдиреЛрдЯ: рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдЦрд╛рддреЗ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдЪрд┐рддреНрд░ 38

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

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

рдЪрд┐рддреНрд░ 39

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╡рд┐рдВрдбреЛ рдЦреБрд▓ рдЬрд╛рдПрдЧреАред

рддрд╕реНрд╡реАрд░ 41

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг;

  • "рд╕рд╛рдорд╛рдиреНрдп" рдЕрдиреБрднрд╛рдЧ - рдСрдЯреЛ-рд╕реНрдЯрд╛рд░реНрдЯ рдХрд╛рд░реНрдп рдЯреНрд░рд┐рдЧрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛;
  • "рдСрдЯреЛ рд░рджреНрдж" рдЕрдиреБрднрд╛рдЧ рдСрдЯреЛ-рд░рджреНрдж рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
  • "рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░" рдЕрдиреБрднрд╛рдЧ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЦреБрд▓реА рдФрд░ рдЧреЛрдкрдиреАрдп рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд▓реЙрдЧрд┐рди рдЬрд╛рдирдХрд╛рд░реА, ssh-keys;
  • "рдХреНрд░реЛрди рдЬреЙрдмреНрд╕" рдЕрдиреБрднрд╛рдЧ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрд╕реВрдЪреА рдХрд╛ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред

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

рдЪрд┐рддреНрд░ 5

рдпрд╣рд╛рдВ рд╣рдо рд╡реИрд░рд┐рдПрдмрд▓ MAIL_USER рдФрд░ MAIL_PASSWORD рдмрдирд╛рдПрдВрдЧреЗ , рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдПрдХ рдИрдореЗрд▓ рдкрд╛рд╕рд╡рд░реНрдб рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд░рд┐рдкреЛрд░реНрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред

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

рдХрд╛рд░реНрдп рдЪрд▓рд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ .travis.yml рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдирд┐рд░реНрджреЗрд╢ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдЬрдбрд╝ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред

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

рдЖрдЗрдП рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдПрдВред

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

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

language: c compiler: - gcc - clang 

рдиреЛрдЯ: рдпрджрд┐ рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдХрд▓рдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрдп рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдЪрд▓реЗрдВрдЧреЗред рдФрд░ рдкрдврд╝реЗрдВ рдпрд╣рд╛рдБ

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

 before_install: - sudo add-apt-repository ppa:ubuntu-lxc/daily -y - wget -q -O - https://files.viva64.com/etc/pubkey.txt | sudo apt-key add - - sudo wget -O /etc/apt/sources.list.d/viva64.list https://files.viva64.com/etc/viva64.list - sudo apt-get update -qq - sudo apt-get install -qq coccinelle parallel libapparmor-dev libcap-dev libseccomp-dev python3-dev python3-setuptools docbook2x libgnutls-dev libselinux1-dev linux-libc-dev pvs-studio libio-socket-ssl-perl libnet-ssleay-perl sendemail ca-certificates 

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЖрдкрдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 script: - ./coccinelle/run-coccinelle.sh -i - git diff --exit-code - export CFLAGS="-Wall -Werror" - export LDFLAGS="-pthread -lpthread" - ./autogen.sh - rm -Rf build - mkdir build - cd build - ../configure --enable-tests --with-distro=unknown 

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

рдлрд┐рд░ рд╣рдо рдкрд╣рд▓реЗ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред $ PVS_USERNAME рдФрд░ $ PVS_KEY рдЪрд░ рдХрд╛ рдбреЗрдЯрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 - pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic 

рдЕрдЧрд▓реЗ рдЖрджреЗрд╢ рддрдХ, рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

 - pvs-studio-analyzer trace -- make -j4 

рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рдиреЛрдЯ: рдЯреНрд░рд╛рдпрд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ --disableLicenseExpirationCheck ред
  - pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic -o PVS-Studio-${CC}.log --disableLicenseExpirationCheck 

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓ рдХреЛ рдЕрдВрддрд┐рдо рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ html-рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 - plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html 

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

 - sendemail -t mail@domain.com -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" -s smtp.gmail.com:587 -xu $MAIL_USER -xp $MAIL_PASSWORD -o tls=yes -f $MAIL_USER -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html 

рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 language: c compiler: - gcc - clang before_install: - sudo add-apt-repository ppa:ubuntu-lxc/daily -y - wget -q -O - https://files.viva64.com/etc/pubkey.txt | sudo apt-key add - - sudo wget -O /etc/apt/sources.list.d/viva64.list https://files.viva64.com/etc/viva64.list - sudo apt-get update -qq - sudo apt-get install -qq coccinelle parallel libapparmor-dev libcap-dev libseccomp-dev python3-dev python3-setuptools docbook2x libgnutls-dev libselinux1-dev linux-libc-dev pvs-studio libio-socket-ssl-perl libnet-ssleay-perl sendemail ca-certificates script: - ./coccinelle/run-coccinelle.sh -i - git diff --exit-code - export CFLAGS="-Wall -Werror" - export LDFLAGS="-pthread -lpthread" - ./autogen.sh - rm -Rf build - mkdir build - cd build - ../configure --enable-tests --with-distro=unknown - pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic - pvs-studio-analyzer trace -- make -j4 - pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic -o PVS-Studio-${CC}.log --disableLicenseExpirationCheck - plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html - sendemail -t mail@domain.com -u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" -m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT" -s smtp.gmail.com:587 -xu $MAIL_USER -xp $MAIL_PASSWORD -o tls=yes -f $MAIL_USER -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html 

рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдирд┐рдореНрди рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреВрд░реНрд╡-рдмрдирд╛рдПрдВ:

 FROM docker.io/ubuntu:trusty ENV CFLAGS="-Wall -Werror" ENV LDFLAGS="-pthread -lpthread" RUN apt-get update && apt-get install -y software-properties-common wget \ && wget -q -O - https://files.viva64.com/etc/pubkey.txt | sudo apt-key add - \ && wget -O /etc/apt/sources.list.d/viva64.list https://files.viva64.com/etc/viva64.list \ && apt-get update \ && apt-get install -yqq coccinelle parallel libapparmor-dev libcap-dev libseccomp-dev python3-dev python3-setuptools docbook2x libgnutls-dev libselinux1-dev linux-libc-dev pvs-studio git libtool autotools-dev automake pkg-config clang make libio-socket-ssl-perl libnet-ssleay-perl sendemail ca-certificates \ && rm -rf /var/lib/apt/lists/* 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:

 before_install: - docker pull docker.io/oandreev/lxc env: - CC=gcc - CC=clang script: - docker run --rm --cap-add SYS_PTRACE -v $(pwd):/pvs -w /pvs docker.io/oandreev/lxc /bin/bash -c " ./coccinelle/run-coccinelle.sh -i && git diff --exit-code && ./autogen.sh && mkdir build && cd build && ../configure CC=$CC && pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic && pvs-studio-analyzer trace -- make -j4 && pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic -o PVS-Studio-$CC.log --disableLicenseExpirationCheck && plog-converter -t html -o PVS-Studio-$CC.html PVS-Studio-$CC.log && sendemail -t mail@domain.com -u 'PVS-Studio $CC report, commit:$TRAVIS_COMMIT' -m 'PVS-Studio $CC report, commit:$TRAVIS_COMMIT' -s smtp.gmail.com:587 -xu $MAIL_USER -xp $MAIL_PASSWORD -o tls=yes -f $MAIL_USER -a PVS-Studio-${CC}.log PVS-Studio-${CC}.html" 

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

рдиреЛрдЯ : рдЬрдм рдЖрдк рдХрдВрдЯреЗрдирд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ --cap-add-SYS_PTRACE рдпрд╛-security-opt seccomp: unconfined , рдЬреИрд╕рд╛ рдХрд┐ ptrace рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдХрдВрд╕реЛрд▓ рдореЗрдВ рдмрд┐рд▓реНрдб рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдФрд░ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдЪреЗрдХ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЪрд┐рддреНрд░ 2

рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рджреЛ рдИрдореЗрд▓ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ: рдкрд╣рд▓рд╛ - рдЬреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде, рдФрд░ рджреВрд╕рд░рд╛ - рдХреНрд░рдорд╢рдГ рдХреНрд▓реИрдВрдЧ рдХреЗ рд▓рд┐рдПред

рдЬрд╛рдБрдЪ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛рдлреА рд╕рд╛рдл рд╣реИ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рдХреЗрд╡рд▓ 24 рдЙрдЪреНрдЪ-рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдФрд░ 46 рдордзреНрдпрдо-рдирд┐рд╢реНрдЪрд┐рдд рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреАред рдЖрдЗрдП рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдВ:

рдпрджрд┐ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реНрдерд┐рддрд┐


V590 'рд░реЗрдЯ! = (- 1) && рд░рд┐рдЯ == 1' рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрддреНрдпрдзрд┐рдХ рд╣реИ рдпрд╛ рдПрдХ рдЧрд▓рдд рдЪрд┐рддреНрд░рдг рд╣реИред рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред 107

 #define EOF -1 static struct lxc_proc_context_info *lxc_proc_get_context_info(pid_t pid) { .... while (getline(&line, &line_bufsz, proc_file) != -1) { ret = sscanf(line, "CapBnd: %llx", &info->capability_mask); if (ret != EOF && ret == 1) // <= { found = true; break; } } .... } 

рдпрджрд┐ рд░рд┐рдЯ == 1 рд╣реИ , рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ -1 (EOF) рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред рдирд┐рд░рд░реНрдердХ рдЬрд╛рдБрдЪ, рд░рд┐рдЯ! = EOF рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рджреЛ рд╕рдорд╛рди рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреА рдЧрдИ рд╣реИрдВ:

  • V590 'рд░реЗрдЯ! = (- 1) && рд░рд┐рдЯ == 1' рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрддреНрдпрдзрд┐рдХ рд╣реИ рдпрд╛ рдПрдХ рдЧрд▓рдд рдЪрд┐рддреНрд░рдг рд╣реИред рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВред 579
  • V590 'рд░реЗрдЯ! = (- 1) && рд░рд┐рдЯ == 1' рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрддреНрдпрдзрд┐рдХ рд╣реИ рдпрд╛ рдПрдХ рдЧрд▓рдд рдЪрд┐рддреНрд░рдг рд╣реИред рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ 583

рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдХрд╛ рдиреБрдХрд╕рд╛рди


V784 рдмрд┐рдЯ рдорд╛рд╕реНрдХ рдХрд╛ рдЖрдХрд╛рд░ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрдВрдб рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдХрдо рд╣реИред рдпрд╣ рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдХреЗ рдиреБрдХрд╕рд╛рди рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред conf.c 1879

 struct mount_opt { char *name; int clear; int flag; }; static void parse_mntopt(char *opt, unsigned long *flags, char **data, size_t size) { struct mount_opt *mo; /* If opt is found in mount_opt, set or clear flags. * Otherwise append it to data. */ for (mo = &mount_opt[0]; mo->name != NULL; mo++) { if (strncmp(opt, mo->name, strlen(mo->name)) == 0) { if (mo->clear) { *flags &= ~mo->flag; // <= } else { *flags |= mo->flag; } return; } } .... } 

рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд, рд▓рдореНрдмрд╛ 64-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдЪрд░ рд╣реИ, рдореЛ-> рдзреНрд╡рдЬ 32-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдЪрд░ рд╣реИред рдореЛ-> рдзреНрд╡рдЬ рдХреЛ рдПрдХ рдмрд┐рдЯ рдорд╛рд╕реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ 32 рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдХрд╛ рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛ред рдПрдХ рдмрд┐рдЯ рдорд╛рд╕реНрдХ рдХреЛ рдмрд┐рдЯрд╡рд╛рдЗрд╕ рдХреЗ рдЙрд▓рдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж 64-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдЪрд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рд╕реНрдХ рдХреЗ рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛:

 unsigned long long x; unsigned y; .... x &= ~y; 

рдЪрд┐рддреНрд░ 3


рдпрд╣рд╛рдБ рдХреЛрдб рдХрд╛ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:

 *flags &= ~(unsigned long)(mo->flag); 

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рдПрдХ рдФрд░ рд╕рдорд╛рди рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреА:

  • V784 рдмрд┐рдЯ рдорд╛рд╕реНрдХ рдХрд╛ рдЖрдХрд╛рд░ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрдВрдб рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдХрдо рд╣реИред рдпрд╣ рдЙрдЪреНрдЪ рдмрд┐рдЯреНрд╕ рдХреЗ рдиреБрдХрд╕рд╛рди рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред conf.c 1933

рд╕рдВрджреЗрд╣рд╛рд╕реНрдкрдж рдкрд╛рд╢


V612 рдПрдХ рд▓реВрдк рдХреЗ рднреАрддрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд 'рд╡рд╛рдкрд╕реА'ред conf.c 3477

 #define lxc_list_for_each(__iterator, __list) \ for (__iterator = (__list)->next; __iterator != __list; \ __iterator = __iterator->next) static bool verify_start_hooks(struct lxc_conf *conf) { char path[PATH_MAX]; struct lxc_list *it; lxc_list_for_each (it, &conf->hooks[LXCHOOK_START]) { int ret; char *hookname = it->elem; ret = snprintf(path, PATH_MAX, "%s%s", conf->rootfs.path ? conf->rootfs.mount : "", hookname); if (ret < 0 || ret >= PATH_MAX) return false; ret = access(path, X_OK); if (ret < 0) { SYSERROR("Start hook \"%s\" not found in container", hookname); return false; } return true; // <= } return true; } 

рд▓реВрдк рдХреЛ рдкрд╣рд▓реЗ рдЪрд▓рдирд╛ рдкрд░ рд╢реБрд░реВ рдФрд░ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓реВрдк рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕реАрдорд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░


V557 рдРрд░реЗ рдЕрдВрдбрд░рд░реВрди рд╕рдВрднрд╡ рд╣реИред 'рдмрд╛рдЗрдЯреНрд╕ - 1' рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдорд╛рди -1 рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ рд╣реИред network.c 2570

 static int lxc_create_network_unpriv_exec(const char *lxcpath, const char *lxcname, struct lxc_netdev *netdev, pid_t pid, unsigned int hooks_version) { int bytes; char buffer[PATH_MAX] = {0}; .... bytes = lxc_read_nointr(pipefd[0], &buffer, PATH_MAX); if (bytes < 0) { SYSERROR("Failed to read from pipe file descriptor"); close(pipefd[0]); } else { buffer[bytes - 1] = '\0'; } .... } 

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

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рдПрдХ рдФрд░ рд╕рдорд╛рди рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреА:

  • V557 рдРрд░реЗ рдЕрдВрдбрд░рд░реВрди рд╕рдВрднрд╡ рд╣реИред 'рдмрд╛рдЗрдЯреНрд╕ - 1' рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдорд╛рди -1 рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ рд╣реИред network.c 2725

рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ


V576 рдЧрд▓рдд рдкреНрд░рд╛рд░реВрдкред 'Sscanf' рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддреАрд╕рд░реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЪреМрдбрд╝рд╛рдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдкреЗрд╕рд┐рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИред рдмрдлрд░ рдУрд╡рд░рдлреНрд▓реЛ рд╕рдВрднрд╡ рд╣реИред lxc_unshare.c 205

 static bool lookup_user(const char *oparg, uid_t *uid) { char name[PATH_MAX]; .... if (sscanf(oparg, "%u", uid) < 1) { /* not a uid -- perhaps a username */ if (sscanf(oparg, "%s", name) < 1) // <= { free(buf); return false; } .... } .... } 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, sscanf рдХрд╛ рдЙрдкрдпреЛрдЧ рдЦрддрд░рдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ oparq рдмрдлрд░ рдирд╛рдо рдмрдлрд░ рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рдирд╛рдо рдмрдлрд░ рдмрдирд╛рддреЗ рд╕рдордп рд╕реВрдЪрдХрд╛рдВрдХ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

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


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

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

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ


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

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


All Articles