PVS-ስቱዲዮ አሁን በCcholatey ውስጥ አለ፡ ቸኮላትን ከ Azure DevOps በመፈተሽ ላይ

PVS-ስቱዲዮ አሁን በCcholatey ውስጥ አለ፡ ቸኮላትን ከ Azure DevOps በመፈተሽ ላይ
PVS-Studioን መጠቀም የበለጠ ምቹ እንዲሆን እንቀጥላለን። የእኛ ተንታኝ አሁን ለዊንዶውስ የጥቅል አስተዳዳሪ በሆነው Chocolatey ውስጥ ይገኛል። ይህ የ PVS-Studioን በተለይም በደመና አገልግሎቶች ውስጥ መዘርጋትን ያመቻቻል ብለን እናምናለን። ሩቅ እንዳንሄድ ፣የተመሳሳዩን ቸኮሌት ምንጭ ኮድ እንፈትሽ። Azure DevOps እንደ CI ስርዓት ይሰራል።

ከደመና ስርዓቶች ጋር ስለመዋሃድ ርዕስ የኛን ሌሎች ጽሑፎቻችን ዝርዝር እነሆ፡-

ከ Azure DevOps ጋር ስለ ውህደት ለመጀመሪያው ጽሑፍ ትኩረት እንድትሰጡ እመክርዎታለሁ ፣ ምክንያቱም በዚህ ጉዳይ ላይ አንዳንድ ነጥቦች እንዳይባዙ ስለሚቀሩ።

ስለዚህ የዚህ ጽሑፍ ጀግኖች፡-

PVS- ስቱዲዮ በC፣ C++፣ C # እና Java በተፃፉ ፕሮግራሞች ውስጥ ስህተቶችን እና ሊከሰቱ የሚችሉ ተጋላጭነቶችን ለመለየት የተነደፈ የማይንቀሳቀስ ኮድ ትንተና መሳሪያ ነው። በ64-ቢት ዊንዶውስ፣ ሊኑክስ እና ማክኦኤስ ሲስተሞች ይሰራል፣ እና ለ32-ቢት፣ 64-ቢት እና ለተከተቱ የኤአርኤም መድረኮች የተቀየሰ ኮድ መተንተን ይችላል። ፕሮጀክቶችህን ለመፈተሽ የማይንቀሳቀስ ኮድ ትንተና ስትሞክር ይህ የመጀመሪያህ ከሆነ፣ እራስህን እንድትተዋውቅ እንመክርሃለን። ጽሑፍ በጣም አስደሳች የሆነውን የ PVS-ስቱዲዮ ማስጠንቀቂያዎችን በፍጥነት እንዴት እንደሚመለከቱ እና የዚህን መሳሪያ አቅም እንዴት እንደሚገመግሙ።

Azure DevOps - አጠቃላይ የእድገት ሂደቱን በጋራ የሚሸፍኑ የደመና አገልግሎቶች ስብስብ። ይህ የመሳሪያ ስርዓት እንደ Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans የመሳሰሉ መሳሪያዎችን ያካትታል, ይህም ሶፍትዌርን የመፍጠር ሂደትን ለማፋጠን እና ጥራቱን ለማሻሻል ያስችላል.

ቸኮሌይ ለዊንዶውስ የክፍት ምንጭ ጥቅል አስተዳዳሪ ነው። የፕሮጀክቱ ግብ ሙሉውን የሶፍትዌር የህይወት ዑደት ከመጫን እስከ ዊንዶውስ ኦፐሬቲንግ ሲስተሞች ላይ እስከ ማዘመን እና ማራገፍ ድረስ በራስ ሰር ማድረግ ነው።

Chocolatey ስለመጠቀም

በዚህ ጊዜ የጥቅል አስተዳዳሪውን እንዴት እንደሚጭኑ ማየት ይችላሉ ማያያዣ. ተንታኙን ለመጫን የተሟሉ ሰነዶች በ ላይ ይገኛሉ ማያያዣ የCchocolatey ጥቅል አስተዳዳሪ ክፍልን በመጠቀም መጫኑን ይመልከቱ። አንዳንድ ነጥቦችን በአጭሩ እደግመዋለሁ።

የተንታኙን የቅርብ ጊዜ ስሪት እንዲጭኑ ትእዛዝ ይስጡ፡-

choco install pvs-studio

የተወሰነ የPVS-ስቱዲዮ ጥቅል ስሪት እንዲጭን ትእዛዝ ይስጡ፡-

choco install pvs-studio --version=7.05.35617.2075

በነባሪነት የተተነተነው ዋና አካል፣ የኮር አካል ብቻ ተጭኗል። ሁሉም ሌሎች ባንዲራዎች (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) --package-parameters በመጠቀም ማለፍ ይቻላል።

ለ Visual Studio 2019 ተንታኝ ከፕለጊን ጋር የሚጭን የትእዛዝ ምሳሌ፡-

choco install pvs-studio --package-parameters="'/MSVS2019'"

አሁን በ Azure DevOps ስር ተንታኙን ምቹ አጠቃቀም ምሳሌ እንመልከት።

በደንብ ማድረግ

እንደ አካውንት መመዝገብ፣ የግንባታ ቧንቧ መስመር መፍጠር እና መለያዎን በ GitHub ማከማቻ ውስጥ ካለው ፕሮጀክት ጋር ማመሳሰልን በተመለከተ የተለየ ክፍል እንዳለ ላስታውስዎት። ጽሑፍ. የእኛ ማዋቀር ወዲያውኑ የማዋቀሪያ ፋይል በመጻፍ ይጀምራል።

በመጀመሪያ፣ የማስጀመሪያ ቀስቅሴን እናዘጋጅ፣ ይህም ለለውጦች ብቻ እንደምንጀምር ያሳያል ባለቤት ቅርንጫፍ፡

trigger:
- master

በመቀጠል ምናባዊ ማሽን መምረጥ አለብን. ለአሁን ከዊንዶውስ አገልጋይ 2019 እና ቪዥዋል ስቱዲዮ 2019 ጋር በማይክሮሶፍት የሚስተናገድ ወኪል ይሆናል።

pool:
  vmImage: 'windows-latest'

ወደ የውቅር ፋይል አካል እንሂድ (አግድ ደረጃዎች). ምንም እንኳን የዘፈቀደ ሶፍትዌሮችን ወደ ቨርቹዋል ማሽን መጫን ባይችሉም የዶከር ኮንቴይነር አልጨመርኩም። Chocolatey ለ Azure DevOps እንደ ቅጥያ ማከል እንችላለን። ይህንን ለማድረግ ወደ እንሂድ ማያያዣ. ጠቅ ያድርጉ በነፃ ያግኙት. በመቀጠል፣ ቀደም ሲል ስልጣን ከተሰጠዎት በቀላሉ መለያዎን ይምረጡ፣ እና ካልሆነ፣ ከተፈቀደ በኋላ ተመሳሳይ ነገር ያድርጉ።

PVS-ስቱዲዮ አሁን በCcholatey ውስጥ አለ፡ ቸኮላትን ከ Azure DevOps በመፈተሽ ላይ

እዚህ ቅጥያውን የምንጨምርበትን ቦታ መምረጥ እና አዝራሩን ጠቅ ማድረግ ያስፈልግዎታል ጫን.

PVS-ስቱዲዮ አሁን በCcholatey ውስጥ አለ፡ ቸኮላትን ከ Azure DevOps በመፈተሽ ላይ

ከተሳካ ጭነት በኋላ ጠቅ ያድርጉ ወደ ድርጅት ቀጥል:

PVS-ስቱዲዮ አሁን በCcholatey ውስጥ አለ፡ ቸኮላትን ከ Azure DevOps በመፈተሽ ላይ

አሁን በመስኮቱ ውስጥ ለ Chocolatey ተግባር አብነት ማየት ይችላሉ ተግባራት የማዋቀሪያ ፋይልን ሲያርትዑ Azure-pipelines.yml:

PVS-ስቱዲዮ አሁን በCcholatey ውስጥ አለ፡ ቸኮላትን ከ Azure DevOps በመፈተሽ ላይ

Chocolatey ላይ ጠቅ ያድርጉ እና የመስኮችን ዝርዝር ይመልከቱ፡-

PVS-ስቱዲዮ አሁን በCcholatey ውስጥ አለ፡ ቸኮላትን ከ Azure DevOps በመፈተሽ ላይ

እዚህ መምረጥ አለብን ጫን በሜዳው ውስጥ ከቡድኖቹ ጋር. ውስጥ Nuspec ፋይል ስም የሚፈለገውን ጥቅል ስም ያመልክቱ - pvs-studio. ስሪቱን ካልገለጹት, የቅርብ ጊዜው ይጫናል, ይህም ሙሉ በሙሉ ይስማማናል. አዝራሩን እንጫን አክል እና የተፈጠረውን ተግባር በማዋቀሪያው ፋይል ውስጥ እናያለን.

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

በመቀጠል ወደ የፋይላችን ዋና ክፍል እንሂድ፡-

- task: CmdLine@2
  inputs:
    script: 

አሁን ከተንታኙ ፈቃድ ጋር ፋይል መፍጠር አለብን። እዚህ PVSNAME и ፒቪስኪ - በቅንብሮች ውስጥ እሴቶቻቸውን የምንገልጽባቸው የተለዋዋጮች ስሞች። የPVS-ስቱዲዮ መግቢያ እና የፍቃድ ቁልፍ ያከማቻሉ። እሴቶቻቸውን ለማዘጋጀት, ምናሌውን ይክፈቱ ተለዋዋጮች-> አዲስ ተለዋዋጭ. ተለዋዋጮችን እንፍጠር PVSNAME ለመግቢያ እና ፒቪስኪ ለተንታኙ ቁልፍ. ሳጥኑ ላይ ምልክት ማድረግን አይርሱ ይህንን እሴት በሚስጥር ያስቀምጡ ለ ፒቪስኪ. የትእዛዝ ኮድ

сall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" credentials 
–u $(PVSNAME) –n $(PVSKEY)

በማጠራቀሚያው ውስጥ የሚገኘውን የባት ፋይል በመጠቀም ፕሮጀክቱን እንገንባ፡-

сall build.bat

ከተንታኙ ውጤቶች ጋር ፋይሎች የሚቀመጡበትን አቃፊ እንፍጠር፡-

сall mkdir PVSTestResults

ፕሮጀክቱን መተንተን እንጀምር፡-

сall "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
–t .srcchocolatey.sln –o .PVSTestResultsChoco.plog 

የ PlogConverter መገልገያን በመጠቀም ሪፖርታችንን ወደ ኤችቲኤምኤል ቅርጸት እንለውጣለን፡-

сall "C:Program Files (x86)PVS-StudioPlogConverter.exe" 
–t html –o PVSTestResults .PVSTestResultsChoco.plog

አሁን ሪፖርቱን ለመጫን እንዲችሉ አንድ ተግባር መፍጠር ያስፈልግዎታል.

- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

የተጠናቀቀው የውቅር ፋይል ይህን ይመስላል።

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: ChocolateyCommand@0
  inputs:
    command: 'install'
    installPackageId: 'pvs-studio'

- task: CmdLine@2
  inputs:
    script: |
      call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
      credentials –u $(PVSNAME) –n $(PVSKEY)
      call build.bat
      call mkdir PVSTestResults
      call "C:Program Files (x86)PVS-StudioPVS-Studio_Cmd.exe" 
      –t .srcchocolatey.sln –o .PVSTestResultsChoco.plog
      call "C:Program Files (x86)PVS-StudioPlogConverter.exe" 
      –t html –o .PVSTestResults .PVSTestResultsChoco.plog

- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: PVSTestResults
    artifactName: PVSTestResults
    condition: always()

ጠቅ እናድርግ አስቀምጥ -> አስቀምጥ -> አሂድ ተግባሩን ለማስኬድ. ወደ ተግባራት ትር በመሄድ ሪፖርቱን እናውርደው።

PVS-ስቱዲዮ አሁን በCcholatey ውስጥ አለ፡ ቸኮላትን ከ Azure DevOps በመፈተሽ ላይ

የቾኮሌቲ ፕሮጀክት 37615 የC# ኮድ መስመሮችን ብቻ ይዟል። የተገኙትን አንዳንድ ስህተቶች እንመልከት።

የሙከራ ውጤቶች

ማስጠንቀቂያ N1

ተንታኝ ማስጠንቀቂያ፡- V3005 የ'አቅራቢው' ተለዋዋጭ ለራሱ ተመድቧል። CrytpoHashProviderSpecs.cs 38

public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
  ....
  protected CryptoHashProvider Provider;
  ....
  public override void Context()
  {
    Provider = Provider = new CryptoHashProvider(FileSystem.Object);
  }
}

ተንታኙ ለራሱ የተለዋዋጭ ምደባን አግኝቷል፣ ይህ ትርጉም አይሰጥም። ምናልባትም፣ ከእነዚህ ተለዋዋጮች በአንዱ ምትክ ሌላ ሊኖር ይገባል። ደህና፣ ወይም ይሄ የትየባ ነው፣ እና ተጨማሪው ስራ በቀላሉ ሊወገድ ይችላል።

ማስጠንቀቂያ N2

ተንታኝ ማስጠንቀቂያ፡- V3093 [CWE-480] የ'&' ኦፕሬተር ሁለቱንም ኦፕሬተሮች ይገመግማል። ምናልባት የአጭር ዙር '&&' ኦፕሬተር በምትኩ ስራ ላይ መዋል አለበት። Platform.cs 64

public static PlatformType get_platform()
{
  switch (Environment.OSVersion.Platform)
  {
    case PlatformID.MacOSX:
    {
      ....
    }
    case PlatformID.Unix:
    if(file_system.directory_exists("/Applications")
      & file_system.directory_exists("/System")
      & file_system.directory_exists("/Users")
      & file_system.directory_exists("/Volumes"))
      {
        return PlatformType.Mac;
      }
        else
          return PlatformType.Linux;
    default:
      return PlatformType.Windows;
  }
}

የኦፕሬተር ልዩነት & ከኦፕሬተር && የገለጻው በግራ በኩል ከሆነ ነው የሐሰት, ከዚያ የቀኝ ጎን አሁንም ይሰላል, በዚህ ጉዳይ ላይ አላስፈላጊ የስልት ጥሪዎችን ያመለክታል system.ማውጫ_አለ.

በተጠቀሰው ክፍል ውስጥ, ይህ ትንሽ ጉድለት ነው. አዎ፣ ይህ ሁኔታ ኦፕሬተሩን በ&&ኦፕሬተር በመተካት ማመቻቸት ይቻላል፣ ነገር ግን ከተግባራዊ እይታ ይህ ምንም አይጎዳም። ነገር ግን፣ በሌሎች ሁኔታዎች፣ በ & እና && መካከል ግራ መጋባት የቀኝ የቃላት አገላለጹ ትክክል ባልሆኑ/ ልክ ባልሆኑ እሴቶች ሲታከም ከባድ ችግር ሊፈጥር ይችላል። ለምሳሌ በስህተት ስብስባችን ውስጥ፣ የ V3093 ምርመራን በመጠቀም ተለይቷል, ይህ ጉዳይ አለ:

if ((k < nct) & (s[k] != 0.0))

መረጃ ጠቋሚው እንኳን ቢሆን k ትክክል አይደለም፣ የድርድር አባል ለመድረስ ጥቅም ላይ ይውላል። በውጤቱም, የተለየ ሁኔታ ይጣላል IndexOutOfRangeException.

ማስጠንቀቂያዎች N3፣ N4

ተንታኝ ማስጠንቀቂያ፡- V3022 [CWE-571] 'shortPrompt' አገላለጽ ሁልጊዜ እውነት ነው። InteractivePrompt.cs 101
ተንታኝ ማስጠንቀቂያ፡- V3022 [CWE-571] 'shortPrompt' አገላለጽ ሁልጊዜ እውነት ነው። InteractivePrompt.cs 105

public static string 
prompt_for_confirmation(.... bool shortPrompt = false, ....)
{
  ....
  if (shortPrompt)
  {
    var choicePrompt = choice.is_equal_to(defaultChoice) //1
    ?
    shortPrompt //2
    ?
    "[[{0}]{1}]".format_with(choice.Substring(0, 1).ToUpperInvariant(), //3
    choice.Substring(1,choice.Length - 1))
    :
    "[{0}]".format_with(choice.ToUpperInvariant()) //0
    : 
    shortPrompt //4
    ? 
    "[{0}]{1}".format_with(choice.Substring(0,1).ToUpperInvariant(), //5
    choice.Substring(1,choice.Length - 1)) 
    :
    choice; //0
    ....
  }
  ....
}

በዚህ ጉዳይ ላይ, ከተርነሪ ኦፕሬተር አሠራር በስተጀርባ አንድ እንግዳ አመክንዮ አለ. እስቲ ጠለቅ ብለን እንመርምር፡ በቁጥር 1 ላይ ያስቀመጥኩት ቅድመ ሁኔታ ከተሟላ፡ ወደ ሁኔታው ​​2 እንሸጋገራለን፡ ይህም ሁል ጊዜ ነው። እውነተኛይህም ማለት መስመር 3 ይፈፀማል ማለት ነው፡ ሁኔታ 1 ሀሰት ሆኖ ከተገኘ፡ ወደ ቁጥር 4 ምልክት ወደ ሚደረግበት መስመር እንሸጋገራለን፡ ይህ ሁኔታም ሁሌም ወደ ሚገኝበት ነው። እውነተኛይህ ማለት መስመር 5 ይፈፀማል ማለት ነው ።በመሆኑም ፣በአስተያየት 0 ምልክት የተደረገባቸው ሁኔታዎች በጭራሽ አይሟሉም ፣ይህም በትክክል ፕሮግራመር የሚጠብቀው የአሠራር አመክንዮ ላይሆን ይችላል።

ማስጠንቀቂያ N5

ተንታኝ ማስጠንቀቂያ፡- V3123 [CWE-783] ምናልባት የ'?:' ኦፕሬተር ከተጠበቀው በተለየ መንገድ ይሰራል። የእሱ ቅድሚያ የሚሰጠው ሁኔታ ከሌሎች ኦፕሬተሮች ቅድሚያ ያነሰ ነው. አማራጮች.cs 1019

private static string GetArgumentName (...., string description)
{
  string[] nameStart;
  if (maxIndex == 1)
  {
    nameStart = new string[]{"{0:", "{"};
  }
  else
  {
    nameStart = new string[]{"{" + index + ":"};
  }
  for (int i = 0; i < nameStart.Length; ++i) 
  {
    int start, j = 0;
    do 
    {
      start = description.IndexOf (nameStart [i], j);
    } 
    while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false);
    ....
    return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
  }
}

ምርመራው ለመስመሩ ሰርቷል፡-

while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false)

ከተለዋዋጭ j ከላይ ያሉት ጥቂት መስመሮች ወደ ዜሮ ተጀምረዋል ፣ የተርነሪ ኦፕሬተር እሴቱን ይመልሳል የሐሰት. በዚህ ሁኔታ ምክንያት የሉፕ አካል አንድ ጊዜ ብቻ ይከናወናል. ይህ ኮድ ፕሮግራመር እንዳሰበው ምንም የማይሰራ ይመስላል።

ማስጠንቀቂያ N6

ተንታኝ ማስጠንቀቂያ፡- V3022 [CWE-571] 'installedPackageVersions.Count != 1' አገላለጽ ሁልጊዜ እውነት ነው። NugetService.cs 1405

private void remove_nuget_cache_for_package(....)
{
  if (!config.AllVersions && installedPackageVersions.Count > 1)
  {
    const string allVersionsChoice = "All versions";
    if (installedPackageVersions.Count != 1)
    {
      choices.Add(allVersionsChoice);
    }
    ....
  }
  ....
}

አንድ እንግዳ የሆነ የጎጆ ሁኔታ እዚህ አለ፡- ተጭኗልPackageVersions.Count!= 1ሁልጊዜም የሚሆነው እውነተኛ. ብዙውን ጊዜ እንዲህ ዓይነቱ ማስጠንቀቂያ በኮዱ ውስጥ የሎጂክ ስህተት መኖሩን ያሳያል, እና በሌሎች ሁኔታዎች ደግሞ በቀላሉ በተደጋጋሚ መፈተሽን ያመለክታል.

ማስጠንቀቂያ N7

ተንታኝ ማስጠንቀቂያ፡- V3001 በ'||' በስተግራ እና በስተቀኝ 'commandArguments.contains("-apikey") ተመሳሳይ ንዑስ-አገላለጾች አሉ። ኦፕሬተር. ArgumentsUtility.cs 42

public static bool arguments_contain_sensitive_information(string
 commandArguments)
{
  return commandArguments.contains("-install-arguments-sensitive")
  || commandArguments.contains("-package-parameters-sensitive")
  || commandArguments.contains("apikey ")
  || commandArguments.contains("config ")
  || commandArguments.contains("push ")
  || commandArguments.contains("-p ")
  || commandArguments.contains("-p=")
  || commandArguments.contains("-password")
  || commandArguments.contains("-cp ")
  || commandArguments.contains("-cp=")
  || commandArguments.contains("-certpassword")
  || commandArguments.contains("-k ")
  || commandArguments.contains("-k=")
  || commandArguments.contains("-key ")
  || commandArguments.contains("-key=")
  || commandArguments.contains("-apikey")
  || commandArguments.contains("-api-key")
  || commandArguments.contains("-apikey")
  || commandArguments.contains("-api-key");
}

ይህንን የኮድ ክፍል የጻፈው ፕሮግራመር የመጨረሻዎቹን ሁለት መስመሮች ገልብጦ ለጥፎ ማረም ረስቶታል። በዚህ ምክንያት የቾኮሌት ተጠቃሚዎች መለኪያውን መተግበር አልቻሉም አፒኪ ሁለት ተጨማሪ መንገዶች። ከላይ ካሉት መለኪያዎች ጋር በሚመሳሰል መልኩ የሚከተሉትን አማራጮች ማቅረብ እችላለሁ፡-

commandArguments.contains("-apikey=");
commandArguments.contains("-api-key=");

የመገልበጥ ስህተቶች ፈጥኖም ይሁን ዘግይቶ ከፍተኛ መጠን ያለው የምንጭ ኮድ ባለው ፕሮጀክት ውስጥ የመታየት እድላቸው ከፍተኛ ነው፣ እና እነሱን ለመቋቋም በጣም ጥሩ ከሆኑ መሳሪያዎች ውስጥ አንዱ የማይንቀሳቀስ ትንታኔ ነው።

PS እና እንደ ሁልጊዜው ይህ ስህተት በባለብዙ መስመር ሁኔታ መጨረሻ ላይ ይታያል :). ህትመቱን ይመልከቱ"የመጨረሻው መስመር ውጤት".

ማስጠንቀቂያ N8

ተንታኝ ማስጠንቀቂያ፡- V3095 [CWE-476] 'የተጫነው ፓኬጅ' ነገር ባዶ ሆኖ ከመረጋገጡ በፊት ጥቅም ላይ ውሏል። መስመሮችን ያረጋግጡ፡ 910፣ 917. NugetService.cs 910

public virtual ConcurrentDictionary<string, PackageResult> get_outdated(....)
{
  ....
  var pinnedPackageResult = outdatedPackages.GetOrAdd(
    packageName, 
    new PackageResult(installedPackage, 
                      _fileSystem.combine_paths(
                        ApplicationParameters.PackagesLocation, 
                        installedPackage.Id)));
  ....
  if (   installedPackage != null
      && !string.IsNullOrWhiteSpace(installedPackage.Version.SpecialVersion) 
      && !config.UpgradeCommand.ExcludePrerelease)
  {
    ....
  }
  ....
}

ክላሲክ ስህተት፡ መጀመሪያ እቃ የተጫነ ፓኬጅ ጥቅም ላይ ይውላል እና ከዚያ ይጣራል ባዶ. ይህ ምርመራ በፕሮግራሙ ውስጥ ካሉት ሁለት ችግሮች አንዱን ይነግረናል፡ ወይ የተጫነ ፓኬጅ ፈጽሞ እኩል አይደለም ባዶ, አጠራጣሪ ነው, እና ከዚያ ቼኩ ብዙ ጊዜ የማይሰራ ነው, ወይም በኮዱ ላይ ከባድ ስህተት ሊኖረን ይችላል - ባዶ ማጣቀሻን ለማግኘት ሙከራ.

መደምደሚያ

ስለዚህ ሌላ ትንሽ እርምጃ ወስደናል - አሁን PVS-Studioን መጠቀም የበለጠ ቀላል እና የበለጠ ምቹ ሆኗል። እኔ ደግሞ ማለት እፈልጋለሁ Chocolatey በኮዱ ውስጥ አነስተኛ ቁጥር ያላቸው ስህተቶች ያሉት ጥሩ የጥቅል አስተዳዳሪ ነው, ይህም PVS-Studio ሲጠቀሙ የበለጠ ያነሰ ሊሆን ይችላል.

እንጋብዝሃለን። скачать እና PVS-Studioን ይሞክሩ። የማይንቀሳቀስ ተንታኝ አዘውትሮ መጠቀም ቡድንዎ የሚያዘጋጀውን ኮድ ጥራት እና አስተማማኝነት ያሻሽላል እና ብዙዎችን ለመከላከል ይረዳል ዜሮ ቀን ድክመቶች.

PS

ከመታተሙ በፊት, ጽሑፉን ለቾኮሌት ገንቢዎች ልከናል, እና እነሱ በደንብ ተቀብለዋል. ምንም ወሳኝ ነገር አላገኘንም፣ ነገር ግን እነሱ፣ ለምሳሌ፣ ከ"api-key" ቁልፍ ጋር የተያያዘውን ስህተት ወደውታል።

PVS-ስቱዲዮ አሁን በCcholatey ውስጥ አለ፡ ቸኮላትን ከ Azure DevOps በመፈተሽ ላይ

ይህንን ጽሑፍ ለእንግሊዝኛ ተናጋሪ ታዳሚዎች ማጋራት ከፈለጉ እባክዎን የትርጉም ማያያዣውን ይጠቀሙ-ቭላዲላቭ ስቶልያሮቭ። PVS-ስቱዲዮ አሁን በቸኮሌት ውስጥ አለ፡ ቸኮሌትን በ Azure DevOps በመፈተሽ ላይ.

ምንጭ: hab.com

አስተያየት ያክሉ