Mae PVS-Studio bellach mewn Chocolatey: yn gwirio Chocolatey o dan Azure DevOps

Mae PVS-Studio bellach mewn Chocolatey: yn gwirio Chocolatey o dan Azure DevOps
Rydym yn parhau i wneud defnyddio PVS-Studio yn fwy cyfleus. Mae ein dadansoddwr bellach ar gael yn Chocolatey, rheolwr pecyn ar gyfer Windows. Credwn y bydd hyn yn hwyluso'r defnydd o PVS-Studio, yn arbennig, mewn gwasanaethau cwmwl. Er mwyn peidio â mynd yn bell, gadewch i ni wirio cod ffynhonnell yr un Chocolatey. Bydd Azure DevOps yn gweithredu fel system CI.

Dyma restr o'n herthyglau eraill ar y pwnc o integreiddio â systemau cwmwl:

Rwy'n eich cynghori i roi sylw i'r erthygl gyntaf am integreiddio ag Azure DevOps, oherwydd yn yr achos hwn mae rhai pwyntiau'n cael eu hepgor er mwyn peidio â chael eu dyblygu.

Felly, arwyr yr erthygl hon:

PVS-Stiwdio Offeryn dadansoddi cod statig yw hwn sydd wedi'i gynllunio i nodi gwallau a gwendidau posibl mewn rhaglenni a ysgrifennwyd yn C, C++, C# a Java. Yn rhedeg ar systemau Windows, Linux, a macOS 64-bit, a gall ddadansoddi cod a ddyluniwyd ar gyfer llwyfannau ARM 32-bit, 64-bit ac wedi'u mewnosod. Os mai dyma'r tro cyntaf i chi geisio dadansoddi cod statig i wirio'ch prosiectau, rydym yn argymell eich bod yn ymgyfarwyddo â nhw erthygl sut i weld y rhybuddion PVS-Stiwdio mwyaf diddorol yn gyflym a gwerthuso galluoedd yr offeryn hwn.

Azure DevOps - set o wasanaethau cwmwl sy'n cwmpasu'r broses ddatblygu gyfan ar y cyd. Mae'r platfform hwn yn cynnwys offer fel Piblinellau Azure, Byrddau Azure, Arteffactau Azure, Azure Repos, Cynlluniau Prawf Azure, sy'n eich galluogi i gyflymu'r broses o greu meddalwedd a gwella ei ansawdd.

Chocolatey yn rheolwr pecyn ffynhonnell agored ar gyfer Windows. Nod y prosiect yw awtomeiddio'r cylch bywyd meddalwedd cyfan o'r gosod i ddiweddaru a dadosod ar systemau gweithredu Windows.

Ynglŷn â defnyddio Chocolatey

Gallwch weld sut i osod y rheolwr pecyn ei hun ar hyn cyswllt. Mae dogfennaeth gyflawn ar gyfer gosod y dadansoddwr ar gael yn cyswllt Gweler y Gosod gan ddefnyddio'r adran rheolwr pecyn Chocolatey. Ailadroddaf yn fyr rai pwyntiau oddi yno.

Gorchymyn i osod y fersiwn diweddaraf o'r dadansoddwr:

choco install pvs-studio

Gorchymyn i osod fersiwn benodol o'r pecyn PVS-Studio:

choco install pvs-studio --version=7.05.35617.2075

Yn ddiofyn, dim ond craidd y dadansoddwr, y gydran Craidd, sy'n cael ei osod. Gellir pasio pob baner arall (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) gan ddefnyddio --package-parameters.

Enghraifft o orchymyn a fydd yn gosod dadansoddwr gydag ategyn ar gyfer Visual Studio 2019:

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

Nawr, gadewch i ni edrych ar enghraifft o ddefnydd cyfleus o'r dadansoddwr o dan Azure DevOps.

addasiad

Gadewch imi eich atgoffa bod yna adran ar wahân am faterion fel cofrestru cyfrif, creu Piblinell Adeiladu a chydamseru'ch cyfrif â phrosiect sydd wedi'i leoli yn ystorfa GitHub. erthygl. Bydd ein gosodiad yn dechrau ar unwaith gydag ysgrifennu ffeil ffurfweddu.

Yn gyntaf, gadewch i ni sefydlu sbardun lansio, gan nodi ein bod yn lansio dim ond ar gyfer newidiadau yn meistr cangen:

trigger:
- master

Nesaf mae angen i ni ddewis peiriant rhithwir. Am y tro bydd yn asiant a gynhelir gan Microsoft gyda Windows Server 2019 a Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Gadewch i ni symud ymlaen i gorff y ffeil ffurfweddu (bloc camau). Er gwaethaf y ffaith na allwch osod meddalwedd mympwyol i mewn i beiriant rhithwir, ni wnes i ychwanegu cynhwysydd Docker. Gallwn ychwanegu Chocolatey fel estyniad ar gyfer Azure DevOps. I wneud hyn, gadewch i ni fynd i cyswllt. Cliciwch Ei gael am ddim. Nesaf, os ydych chi eisoes wedi'ch awdurdodi, dewiswch eich cyfrif, ac os na, gwnewch yr un peth ar ôl awdurdodi.

Mae PVS-Studio bellach mewn Chocolatey: yn gwirio Chocolatey o dan Azure DevOps

Yma mae angen i chi ddewis lle byddwn yn ychwanegu'r estyniad a chlicio ar y botwm Gosod.

Mae PVS-Studio bellach mewn Chocolatey: yn gwirio Chocolatey o dan Azure DevOps

Ar ôl gosod llwyddiannus, cliciwch Ymlaen i'r sefydliad:

Mae PVS-Studio bellach mewn Chocolatey: yn gwirio Chocolatey o dan Azure DevOps

Gallwch nawr weld y templed ar gyfer y dasg Chocolatey yn y ffenestr tasgau wrth olygu ffeil ffurfweddu asur-piblinellau.yml:

Mae PVS-Studio bellach mewn Chocolatey: yn gwirio Chocolatey o dan Azure DevOps

Cliciwch ar Chocolatey a gweld rhestr o feysydd:

Mae PVS-Studio bellach mewn Chocolatey: yn gwirio Chocolatey o dan Azure DevOps

Yma mae angen i ni ddewis gosod yn y maes gyda'r timau. YN Enw Ffeil Nuspec nodwch enw'r pecyn gofynnol - pvs-studio. Os na fyddwch yn nodi'r fersiwn, bydd yr un diweddaraf yn cael ei osod, sy'n addas i ni yn llwyr. Gadewch i ni bwyso'r botwm ychwanegu a byddwn yn gweld y dasg a gynhyrchir yn y ffeil ffurfweddu.

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

Nesaf, gadewch i ni symud ymlaen i brif ran ein ffeil:

- task: CmdLine@2
  inputs:
    script: 

Nawr mae angen i ni greu ffeil gyda'r drwydded dadansoddwr. Yma PVSNAME и PVSKEY – enwau newidynnau y byddwn yn nodi eu gwerthoedd yn y gosodiadau. Byddant yn storio'r mewngofnodi PVS-Studio ac allwedd trwydded. I osod eu gwerthoedd, agorwch y ddewislen Newidynnau -> Newidyn newydd. Gadewch i ni greu newidynnau PVSNAME ar gyfer mewngofnodi a PVSKEY ar gyfer allwedd y dadansoddwr. Peidiwch ag anghofio gwirio'r blwch Cadwch y gwerth hwn yn gyfrinachol gyfer PVSKEY. Cod gorchymyn:

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

Gadewch i ni adeiladu'r prosiect gan ddefnyddio'r ffeil ystlumod sydd wedi'i lleoli yn y gadwrfa:

сall build.bat

Gadewch i ni greu ffolder lle bydd ffeiliau gyda chanlyniadau'r dadansoddwr yn cael eu storio:

сall mkdir PVSTestResults

Gadewch i ni ddechrau dadansoddi'r prosiect:

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

Rydym yn trosi ein hadroddiad i fformat html gan ddefnyddio cyfleustodau Plogіonverter:

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

Nawr mae angen i chi greu tasg fel y gallwch chi uwchlwytho'r adroddiad.

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

Mae'r ffeil ffurfweddu gyflawn yn edrych fel hyn:

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()

Gadewch i ni glicio Cadw-> Arbed-> Rhedeg i redeg y dasg. Gadewch i ni lawrlwytho'r adroddiad trwy fynd i'r tab tasgau.

Mae PVS-Studio bellach mewn Chocolatey: yn gwirio Chocolatey o dan Azure DevOps

Mae'r prosiect Chocolatey yn cynnwys 37615 llinell yn unig o god C#. Gadewch i ni edrych ar rai o'r gwallau a ganfuwyd.

Canlyniadau profion

Rhybudd N1

Rhybudd dadansoddwr: V3005 Mae'r newidyn 'Darparwr' wedi'i neilltuo iddo'i hun. CrytpoHashProviderSpecs.cs 38

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

Canfu'r dadansoddwr aseiniad o'r newidyn iddo'i hun, nad yw'n gwneud synnwyr. Yn fwyaf tebygol, yn lle un o'r newidynnau hyn dylai fod un arall. Wel, neu teipio yw hwn, a gellir dileu'r aseiniad ychwanegol yn syml.

Rhybudd N2

Rhybudd dadansoddwr: V3093 [CWE-480] Mae'r gweithredwr '&' yn gwerthuso'r ddwy operand. Efallai y dylid defnyddio gweithredwr cylched byr '&&' yn lle hynny. Platfform.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;
  }
}

Gwahaniaeth gweithredwr & gan y gweithredwr && yw os yw ochr chwith y mynegiant yn ffug, yna bydd yr ochr dde yn dal i gael ei gyfrifo, sydd yn yr achos hwn yn awgrymu galwadau dull diangen system.directory_exists.

Yn y darn a ystyriwyd, mân ddiffyg yw hwn. Oes, gellir optimeiddio'r amod hwn trwy ddisodli'r & gweithredwr gyda'r && gweithredwr, ond o safbwynt ymarferol, nid yw hyn yn effeithio ar unrhyw beth. Fodd bynnag, mewn achosion eraill, gall dryswch rhwng & a && achosi problemau difrifol pan fydd ochr dde'r ymadrodd yn cael ei thrin â gwerthoedd anghywir/annilys. Er enghraifft, yn ein casgliad gwallau, wedi'i nodi gan ddefnyddio'r diagnostig V3093, mae'r achos hwn:

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

Hyd yn oed os yw'r mynegai k yn anghywir, bydd yn cael ei ddefnyddio i gyrchu elfen arae. O ganlyniad, bydd eithriad yn cael ei daflu MynegaiOutOfRangeException.

Rhybuddion N3, N4

Rhybudd dadansoddwr: V3022 [CWE-571] Mae mynegiant 'shortPrompt' bob amser yn wir. InteractivePrompt.cs 101
Rhybudd dadansoddwr: V3022 [CWE-571] Mae mynegiant 'shortPrompt' bob amser yn wir. 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
    ....
  }
  ....
}

Yn yr achos hwn, mae yna resymeg ryfedd y tu ôl i weithrediad y gweithredwr teiran. Gadewch i ni edrych yn agosach: os bodlonir y cyflwr a nodais â rhif 1, yna symudwn ymlaen i amod 2, sydd bob amser yn wir, sy'n golygu y bydd llinell 3 yn cael ei gweithredu. Os bydd amod 1 yn ffug, yna byddwn yn mynd i'r llinell sydd wedi'i marcio â rhif 4, mae'r cyflwr hefyd bob amser yn wir, sy'n golygu y bydd llinell 5 yn cael ei gweithredu.

Rhybudd N5

Rhybudd dadansoddwr: V3123 [CWE-783] Efallai bod y gweithredwr '?:' yn gweithio mewn ffordd wahanol i'r disgwyl. Mae ei flaenoriaeth yn is na blaenoriaeth gweithredwyr eraill yn ei gyflwr. Opsiynau.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);
  }
}

Gweithiodd y diagnostig ar gyfer y llinell:

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

Ers y newidyn j mae ychydig o linellau uchod yn cael eu cychwyn i sero, bydd y gweithredwr teiran yn dychwelyd y gwerth ffug. Oherwydd yr amod hwn, dim ond unwaith y bydd corff y ddolen yn cael ei weithredu. Mae'n ymddangos i mi nad yw'r darn hwn o god yn gweithio o gwbl fel y bwriadodd y rhaglennydd.

Rhybudd N6

Rhybudd dadansoddwr: V3022 [CWE-571] Mae'r ymadrodd 'installedPackageVersions.Count!= 1' bob amser yn wir. 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);
    }
    ....
  }
  ....
}

Mae cyflwr nythu rhyfedd yma: installPackageVersions.Count != 1a fydd bob amser yn wir. Yn aml mae rhybudd o'r fath yn nodi gwall rhesymegol yn y cod, ac mewn achosion eraill mae'n nodi gwirio diangen.

Rhybudd N7

Rhybudd dadansoddwr: V3001 Ceir is-fynegiadau unfath 'commandArguments.contains("-apikey")' i'r chwith ac i'r dde o'r '|| gweithredydd. DadleuonUtility.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");
}

Fe wnaeth y rhaglennydd a ysgrifennodd yr adran hon o god gopïo a gludo'r ddwy linell olaf ac anghofio eu golygu. Oherwydd hyn, nid oedd defnyddwyr Chocolatey yn gallu defnyddio'r paramedr pigyn cwpl mwy o ffyrdd. Yn debyg i'r paramedrau uchod, gallaf gynnig yr opsiynau canlynol:

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

Mae gan wallau copi-past siawns uchel o ymddangos yn hwyr neu'n hwyrach mewn unrhyw brosiect gyda llawer iawn o god ffynhonnell, ac un o'r arfau gorau i'w hymladd yw dadansoddiad statig.

PS Ac fel bob amser, mae'r gwall hwn yn tueddu i ymddangos ar ddiwedd cyflwr aml-linell :). Gweler y cyhoeddiad "Effaith llinell olaf".

Rhybudd N8

Rhybudd dadansoddwr: V3095 [CWE-476] Defnyddiwyd y gwrthrych 'installedPackage' cyn iddo gael ei ddilysu yn erbyn null. Llinellau gwirio: 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)
  {
    ....
  }
  ....
}

Camgymeriad clasurol: gwrthrych yn gyntaf installPackage yn cael ei ddefnyddio ac yna'n cael ei wirio amdano null. Mae'r diagnostig hwn yn dweud wrthym am un o ddwy broblem yn y rhaglen: naill ai installPackage byth yn gyfartal null, sy'n amheus, ac yna mae'r siec yn ddiangen, neu gallem o bosibl gael gwall difrifol yn y cod - ymgais i gael mynediad at gyfeirnod null.

Casgliad

Felly rydym wedi cymryd cam bach arall - nawr mae defnyddio PVS-Studio wedi dod hyd yn oed yn haws ac yn fwy cyfleus. Hoffwn hefyd ddweud bod Chocolatey yn rheolwr pecyn da gyda nifer fach o wallau yn y cod, a allai fod hyd yn oed yn llai wrth ddefnyddio PVS-Studio.

Rydym yn gwahodd скачать a rhowch gynnig ar PVS-Studio. Bydd defnydd rheolaidd o ddadansoddwr statig yn gwella ansawdd a dibynadwyedd y cod y mae eich tîm yn ei ddatblygu ac yn helpu i atal llawer dim gwendidau diwrnod.

PS

Cyn ei chyhoeddi, fe wnaethom anfon yr erthygl at y datblygwyr Chocolatey, a chawsant ei derbyn yn dda. Ni ddaethom o hyd i unrhyw beth hollbwysig, ond roedden nhw, er enghraifft, yn hoffi'r byg a welsom yn ymwneud â'r allwedd “api-key”.

Mae PVS-Studio bellach mewn Chocolatey: yn gwirio Chocolatey o dan Azure DevOps

Os ydych chi am rannu'r erthygl hon â chynulleidfa Saesneg ei hiaith, defnyddiwch y ddolen gyfieithu: Vladislav Stolyarov. Mae PVS-Studio Nawr mewn Siocled: Gwirio Siocled o dan Azure DevOps.

Ffynhonnell: hab.com

Ychwanegu sylw