Tha PVS-Studio a-nis ann an Chocolatey: a ’sgrùdadh Chocolatey bho fo Azure DevOps

Tha PVS-Studio a-nis ann an Chocolatey: a ’sgrùdadh Chocolatey bho fo Azure DevOps
Tha sinn a’ leantainn oirnn a’ dèanamh cleachdadh PVS-Studio nas goireasaiche. Tha an anailisiche againn a-nis ri fhaighinn ann an Chocolatey, manaidsear pacaid airson Windows. Tha sinn den bheachd gun cuidich seo le bhith a’ cleachdadh PVS-Studio, gu sònraichte, ann an seirbheisean sgòthan. Gus nach tèid sinn fada, leig dhuinn sùil a thoirt air còd stòr an aon Chocolatey. Bidh Azure DevOps ag obair mar shiostam CI.

Seo liosta de na h-artaigilean eile againn air cuspair amalachadh le siostaman sgòthan:

Tha mi a 'toirt comhairle dhut aire a thoirt don chiad artaigil mu aonachadh le Azure DevOps, oir anns a' chùis seo tha cuid de phuingean air am fàgail gus nach tèid an dùblachadh.

Mar sin, gaisgich an artaigil seo:

PVS-Studio na inneal sgrùdaidh còd statach a chaidh a dhealbhadh gus mearachdan agus so-leòntachd a chomharrachadh ann am prògraman sgrìobhte ann an C, C ++, C # agus Java. A’ ruith air siostaman 64-bit Windows, Linux, agus macOS, agus is urrainn dhaibh còd a dhealbhadh airson àrd-ùrlaran 32-bit, 64-bit, agus freumhaichte ARM. Mas e seo a’ chiad uair a tha thu a’ feuchainn mion-sgrùdadh còd statach gus sùil a thoirt air na pròiseactan agad, tha sinn a’ moladh gum bi thu eòlach air artaigil mu mar a choimheadas tu gu sgiobalta air na rabhaidhean PVS-Studio as inntinniche agus dèan measadh air comasan an inneil seo.

Azure DevOps - seata de sheirbheisean sgòthan a tha a’ còmhdach a’ phròiseas leasachaidh gu lèir còmhla. Tha an àrd-ùrlar seo a’ toirt a-steach innealan leithid Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, a leigeas leat pròiseas cruthachadh bathar-bog a luathachadh agus a chàileachd adhartachadh.

Chocolatey na mhanaidsear pacaid stòr fosgailte airson Windows. Is e amas a’ phròiseict cearcall-beatha a’ bhathar-bog gu lèir a dhèanamh fèin-ghluasadach bho stàladh gu ùrachadh is dì-stàladh air siostaman-obrachaidh Windows.

Mu bhith a’ cleachdadh Chocolatey

Chì thu mar a stàlaicheas tu am manaidsear pacaid fhèin aig an seo cheangal. Tha sgrìobhainnean iomlan airson an anailisiche a stàladh rim faighinn aig cheangal Faic an stàladh a’ cleachdadh an roinn manaidsear pacaid Chocolatey. Nì mi ath-aithris goirid air cuid de phuingean às an sin.

Òrdugh gus an tionndadh as ùire den anailisiche a stàladh:

choco install pvs-studio

Òrdugh gus dreach sònraichte den phasgan PVS-Studio a stàladh:

choco install pvs-studio --version=7.05.35617.2075

Gu gnàthach, chan eil ach cridhe an anailisiche, am prìomh phàirt, air a chuir a-steach. Faodar a h-uile bratach eile (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) a thoirt seachad le bhith a’ cleachdadh --package-parameters.

Eisimpleir de àithne a stàlaicheas anailisiche le plugan airson Visual Studio 2019:

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

A-nis leig dhuinn sùil a thoirt air eisimpleir de chleachdadh goireasach den anailisiche fo Azure DevOps.

adjustment

Leig leam do chuimhneachadh gu bheil earrann air leth ann mu chùisean leithid clàradh cunntas, cruthachadh Pìoba Togail agus sioncronadh do chunntas le pròiseact a tha suidhichte ann an stòr GitHub. artaigil. Tòisichidh an stèidheachadh againn sa bhad le bhith a’ sgrìobhadh faidhle rèiteachaidh.

An toiseach, leig dhuinn inneal tòiseachaidh a chuir air bhog, a’ nochdadh nach cuir sinn air bhog ach airson atharrachaidhean ann an mhaighstir meur:

trigger:
- master

An uairsin feumaidh sinn inneal brìgheil a thaghadh. Airson a-nis bidh e na àidseant le aoigheachd Microsoft le Windows Server 2019 agus Visual Studio 2019:

pool:
  vmImage: 'windows-latest'

Gluaisidh sinn air adhart gu corp an fhaidhle rèiteachaidh (bloc ceumannan). A dh ’aindeoin nach urrainn dhut bathar-bog neo-riaghailteach a chuir a-steach do inneal brìgheil, cha do chuir mi inneal Docker ris. Is urrainn dhuinn Chocolatey a chuir ris mar leudachadh airson Azure DevOps. Gus seo a dhèanamh, rachamaid gu cheangal. Cliog Faigh e an-asgaidh. An uairsin, ma tha thu ùghdarraichte mu thràth, dìreach tagh do chunntas, agus mura h-eil, dèan an aon rud às deidh cead fhaighinn.

Tha PVS-Studio a-nis ann an Chocolatey: a ’sgrùdadh Chocolatey bho fo Azure DevOps

An seo feumaidh tu taghadh far an cuir sinn an leudachadh agus cliog air a’ phutan Stàlaich.

Tha PVS-Studio a-nis ann an Chocolatey: a ’sgrùdadh Chocolatey bho fo Azure DevOps

Às deidh an stàladh soirbheachail, cliog Lean air adhart gu buidheann:

Tha PVS-Studio a-nis ann an Chocolatey: a ’sgrùdadh Chocolatey bho fo Azure DevOps

Chì thu a-nis an teamplaid airson gnìomh Chocolatey san uinneig gnìomhan nuair a bhios tu a’ deasachadh faidhle rèiteachaidh azure-pipelines.yml:

Tha PVS-Studio a-nis ann an Chocolatey: a ’sgrùdadh Chocolatey bho fo Azure DevOps

Cliog air Chocolatey agus faic liosta de raointean:

Tha PVS-Studio a-nis ann an Chocolatey: a ’sgrùdadh Chocolatey bho fo Azure DevOps

An seo feumaidh sinn taghadh stàlaich san raon leis na sgiobaidhean. ANNS Ainm faidhle Nuspec comharraich ainm a’ phacaid a tha a dhìth - pvs-studio. Mura sònraich thu an dreach, thèid am fear as ùire a chuir a-steach, a tha freagarrach dhuinn gu tur. Leig leinn am putan a bhrùthadh ris agus chì sinn an gnìomh a chaidh a chruthachadh anns an fhaidhle rèiteachaidh.

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

An ath rud, gluaisidh sinn air adhart chun phrìomh phàirt den fhaidhle againn:

- task: CmdLine@2
  inputs:
    script: 

A-nis feumaidh sinn faidhle a chruthachadh leis a’ chead anailisiche. Seo PVSNAME и PVSKEY - ainmean caochladairean aig a bheil na luachan a tha sinn a’ sònrachadh anns na roghainnean. Glèidhidh iad an logadh a-steach PVS-Studio agus an iuchair ceadachais. Gus na luachan aca a shuidheachadh, fosgail a’ chlàr Caochlaidhean -> Caochladair ùr. Cruthaichidh sinn caochladairean PVSNAME airson logadh a-steach agus PVSKEY airson an iuchair analyzer. Na dìochuimhnich sùil a thoirt air a’ bhogsa Cùm an luach seo dìomhair airson PVSKEY. Còd àithne:

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

Nach tog sinn am pròiseact a’ cleachdadh am faidhle ialtagan a tha suidhichte san stòr:

сall build.bat

Cruthaichidh sinn pasgan far an tèid faidhlichean le toraidhean an anailisiche a stòradh:

сall mkdir PVSTestResults

Feuch an tòisich sinn a’ mion-sgrùdadh a’ phròiseict:

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

Tionndaidhidh sinn an aithisg againn gu cruth html a’ cleachdadh goireas Plogіonverter:

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

A-nis feumaidh tu gnìomh a chruthachadh gus an urrainn dhut an aithisg a luchdachadh suas.

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

Tha am faidhle rèiteachaidh iomlan a’ coimhead mar seo:

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

Briogamaid Sàbhail-> Sàbhail-> Ruith gus an obair a ruith. Luchdaich a-nuas an aithisg le bhith a ' dol gu taba gnìomhan.

Tha PVS-Studio a-nis ann an Chocolatey: a ’sgrùdadh Chocolatey bho fo Azure DevOps

Chan eil anns a’ phròiseact Chocolatey ach 37615 loidhnichean de chòd C#. Bheir sinn sùil air cuid de na mearachdan a chaidh a lorg.

Toraidhean deuchainn

Rabhadh N1

Rabhadh anailisiche: V3005 Tha an caochladair 'Solaraiche' air a shònrachadh dha fhèin. CrytpoHashProviderSpecs.cs 38

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

Lorg an anailisiche sònrachadh den chaochladair dha fhèin, rud nach eil a’ dèanamh ciall. Nas coltaiche, an àite aon de na caochladairean sin bu chòir fear eile a bhith ann. Uill, no is e typo a tha seo, agus faodar an sònrachadh a bharrachd a thoirt air falbh.

Rabhadh N2

Rabhadh anailisiche: V3093 [CWE-480] Bidh an gnìomhaiche ‘&’ a’ measadh an dà opara. Is dòcha gum bu chòir gnìomhaiche geàrr-chuairt '&&' a chleachdadh na àite. Àrd-ùrlar.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;
  }
}

Eadar-dhealachadh gnìomhaiche & bhon ghnìomhaiche && is e sin ma tha taobh clì an abairt ceàrr, an uairsin bidh an taobh cheart fhathast air a thomhas, a tha sa chùis seo a 'ciallachadh gairmean dòigh neo-riatanach system.directory_ann.

Anns a’ chriomag air a bheilear a’ beachdachadh, is e locht beag a tha seo. Faodaidh, faodar an suidheachadh seo a bharrachadh le bhith a’ cur && a’ ghnìomhaiche an àite a’ ghnìomhaiche, ach bho shealladh practaigeach, chan eil seo a’ toirt buaidh air rud sam bith. Ach, ann an cùisean eile, faodaidh troimh-chèile eadar & agus && duilgheadasan mòra adhbhrachadh nuair a thathar a’ làimhseachadh taobh deas an abairt le luachan ceàrr/neo-dhligheach. Mar eisimpleir, anns a’ chruinneachadh mhearachdan againn, air a chomharrachadh le bhith a’ cleachdadh an diagnostic V3093, tha a 'chùis seo ann:

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

Fiù ma tha an clàr-amais k tha e ceàrr, thèid a chleachdadh gus faighinn gu eileamaid rèite. Mar thoradh air an sin, thèid eisgeachd a thilgeil IndexOutOfRangeException.

Rabhaidhean N3, N4

Rabhadh anailisiche: V3022 [CWE-571] Tha abairt ‘shortPrompt’ an-còmhnaidh fìor. InteractivePrompt.cs 101
Rabhadh anailisiche: V3022 [CWE-571] Tha abairt ‘shortPrompt’ an-còmhnaidh fìor. 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
    ....
  }
  ....
}

Anns a ‘chùis seo, tha loidsig neònach air cùl gnìomhachd a’ ghnìomhaiche ternary. Bheir sinn sùil nas mionaidiche: ma thèid an suidheachadh a chomharraich mi le àireamh 1 a choileanadh, gluaisidh sinn air adhart gu suidheachadh 2, a tha an-còmhnaidh fìor, a tha a’ ciallachadh gun tèid loidhne 3 a chuir gu bàs. fìor, a tha a’ ciallachadh gun tèid loidhne 5 a chur an gnìomh.

Rabhadh N5

Rabhadh anailisiche: V3123 [CWE-783] Is dòcha gu bheil an gnìomhaiche ‘?:’ ag obair ann an dòigh eadar-dhealaichte na bha dùil. Tha a phrìomhachas nas ìsle na prìomhachas ghnìomhaichean eile na staid. Roghainnean.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);
  }
}

Dh'obraich an diagnosachd airson na loidhne:

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

Air sgàth an caochlaideach j tha beagan loidhnichean gu h-àrd air an tòiseachadh gu neoni, tillidh an gnìomhaiche ternary an luach ceàrr. Air sgàth an t-suidheachaidh seo, cha tèid corp an lùb a chuir gu bàs ach aon turas. Tha e coltach riumsa nach eil am pìos còd seo ag obair idir mar a bha am prògramadair an dùil.

Rabhadh N6

Rabhadh anailisiche: V3022 [CWE-571] Tha an abairt ‘installedPackageVersions.Count!= 1’ an-còmhnaidh fìor. Seirbheis Nuget.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);
    }
    ....
  }
  ....
}

Tha suidheachadh neadachaidh neònach an seo: installPackageVersions.Count != 1a bhios gu bràth fìor. Gu math tric tha an leithid de rabhadh a 'nochdadh mearachd loidsigeach anns a' chòd, agus ann an cùisean eile tha e dìreach a 'comharrachadh sgrùdadh gun fheum.

Rabhadh N7

Rabhadh anailisiche: V3001 Tha co-ionann fo-fhrith-bheachdan 'commandArguments.contains ("-apikey")' air an taobh chlì agus air an làimh dheis den '||' gnìomhaiche. ArgumaideanUtility.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");
}

Rinn am prògramadair a sgrìobh an earrann seo de chòd lethbhreac agus pasg air an dà loidhne mu dheireadh agus dhìochuimhnich e an deasachadh. Air sgàth seo, cha b’ urrainn do luchd-cleachdaidh Chocolatey am paramadair a chuir an sàs piocaid dòigh no dhà eile. Coltach ris na paramadairean gu h-àrd, is urrainn dhomh na roghainnean a leanas a thabhann:

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

Tha deagh chothrom aig mearachdan lethbhreac-pas nochdadh nas luaithe no nas fhaide air adhart ann am pròiseact sam bith le tòrr còd stòr, agus is e mion-sgrùdadh statach aon de na h-innealan as fheàrr airson cuir an-aghaidh iad.

PS Agus mar as àbhaist, tha am mearachd seo buailteach nochdadh aig deireadh suidheachadh ioma-loidhne :). Faic am foillseachadh "A 'bhuaidh loidhne mu dheireadh".

Rabhadh N8

Rabhadh anailisiche: V3095 [CWE-476] Chaidh an nì ‘installedPackage’ a chleachdadh mus deach a dhearbhadh an aghaidh null. Thoir sùil air loidhnichean: 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)
  {
    ....
  }
  ....
}

Mearachd clasaigeach: nì an toiseach Pasgan air a stàladh air a chleachdadh agus an uairsin air a sgrùdadh null. Tha am breithneachadh seo ag innse dhuinn mu aon de dhà dhuilgheadas sa phrògram: an dàrna cuid Pasgan air a stàladh riamh co-ionnan null, a tha teagmhach, agus an uairsin tha an t-seic gun fheum, no dh’ fhaodadh sinn fìor mhearachd fhaighinn sa chòd - oidhirp faighinn gu iomradh neo-eisimeileach.

co-dhùnadh

Mar sin tha sinn air ceum beag eile a ghabhail - a-nis tha cleachdadh PVS-Studio air fàs eadhon nas fhasa agus nas goireasaiche. Bu mhath leam cuideachd a ràdh gu bheil Chocolatey na mhanaidsear pacaid math le àireamh bheag de mhearachdan sa chòd, a dh ’fhaodadh a bhith eadhon nas lugha nuair a bhios tu a’ cleachdadh PVS-Studio.

Tha sinn a ’toirt cuireadh скачать agus feuch PVS-Studio. Le bhith a’ cleachdadh anailisiche statach gu cunbhalach leasaichidh e càileachd agus earbsachd a’ chòd a bhios an sgioba agad a’ leasachadh agus cuidichidh e le bhith a’ casg mòran so-leòntachd latha neoni.

PS

Mus deach fhoillseachadh, chuir sinn an artaigil gu luchd-leasachaidh Chocolatey, agus fhuair iad e gu math. Cha do lorg sinn dad deatamach, ach bu toil leotha, mar eisimpleir, am biast a lorg sinn co-cheangailte ris an iuchair “api-key”.

Tha PVS-Studio a-nis ann an Chocolatey: a ’sgrùdadh Chocolatey bho fo Azure DevOps

Ma tha thu airson an artaigil seo a cho-roinn le luchd-èisteachd Beurla, cleachd an ceangal eadar-theangachaidh: Vladislav Stolyarov. Tha PVS-Studio a-nis ann an Chocolatey: A ’sgrùdadh Chocolatey fo Azure DevOps.

Source: www.habr.com

Cuir beachd ann