ProHoster > PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps
PVS-Studio is no yn Chocolatey: Chocolatey kontrolearje fan ûnder Azure DevOps
Wy bliuwe it gebrûk fan PVS-Studio handiger te meitsjen. Us analysator is no beskikber yn Chocolatey, in pakketbehearder foar Windows. Wy leauwe dat dit de ynset fan PVS-Studio sil fasilitearje, benammen yn wolktsjinsten. Om net fier te gean, litte wy de boarnekoade fan deselde Chocolatey kontrolearje. Azure DevOps sil fungearje as in CI-systeem.
Hjir is in list fan ús oare artikels oer it ûnderwerp fan yntegraasje mei wolksystemen:
Ik advisearje jo om omtinken te jaan oan it earste artikel oer yntegraasje mei Azure DevOps, om't yn dit gefal guon punten binne weilitten om net te duplikearjen.
Dat, de helden fan dit artikel:
PVS-Studio is in statyske koade analyze ark ûntwurpen foar in identifisearje flaters en potinsjele kwetsberens yn programma skreaun yn C, C ++, C # en Java. Rint op 64-bit Windows-, Linux- en macOS-systemen, en kin koade analysearje ûntworpen foar 32-bit, 64-bit en ynbêde ARM-platfoarms. As dit de earste kear is dat jo statyske koade-analyse besykje om jo projekten te kontrolearjen, riede wy oan dat jo josels fertroud meitsje mei lidwurd oer hoe't jo fluch de meast nijsgjirrige PVS-Studio warskôgings kinne besjen en de mooglikheden fan dit ark evaluearje.
Azure DevOps - in set wolktsjinsten dy't tegearre it heule ûntwikkelingsproses dekke. Dit platfoarm omfettet ark lykas Azure Pipelines, Azure Boards, Azure Artifacts, Azure Repos, Azure Test Plans, wêrtroch jo it proses fan it meitsjen fan software kinne fersnelle en de kwaliteit ferbetterje.
Chocolade is in iepen boarne pakketbehearder foar Windows. It doel fan it projekt is om de hiele software-libbenssyklus te automatisearjen fan ynstallaasje oant bywurkjen en de-ynstallaasje op Windows-bestjoeringssystemen.
Oer it brûken fan Chocolatey
Jo kinne hjir sjen hoe't jo de pakketbehearder sels kinne ynstallearje link. Folsleine dokumintaasje foar it ynstallearjen fan de analysator is beskikber op link Sjoch de Ynstallaasje mei de seksje Chocolatey-pakketbehearder. Ik sil dêr koart wat punten werhelje.
Kommando om de lêste ferzje fan 'e analysator te ynstallearjen:
choco install pvs-studio
Kommando om in spesifike ferzje fan it pakket PVS-Studio te ynstallearjen:
Standert is allinich de kearn fan 'e analysator, de Core-komponint, ynstalleare. Alle oare flaggen (Standalone, JavaCore, IDEA, MSVS2010, MSVS2012, MSVS2013, MSVS2015, MSVS2017, MSVS2019) kinne wurde trochjûn mei --package-parameters.
In foarbyld fan in kommando dat in analysator sil ynstallearje mei in plugin foar Visual Studio 2019:
Litte wy no sjen nei in foarbyld fan handich gebrûk fan 'e analysator ûnder Azure DevOps.
oanpassing
Lit my jo herinnerje dat d'r in aparte seksje is oer sokke problemen as it registrearjen fan in akkount, it meitsjen fan in Build Pipeline en syngronisearje fan jo akkount mei in projekt yn it GitHub-repository. artikel. Us opset sil fuortendaliks begjinne mei it skriuwen fan in konfiguraasjetriem.
Litte wy earst in starttrigger ynstelle, wat oanjout dat wy allinich starte foar feroaringen yn master tûke:
trigger:
- master
Folgjende moatte wy in firtuele masine selektearje. Foar no sil it in Microsoft-hosted agent wêze mei Windows Server 2019 en Visual Studio 2019:
pool:
vmImage: 'windows-latest'
Litte wy trochgean nei it lichem fan it konfiguraasjetriem (blok stappen). Nettsjinsteande it feit dat jo gjin willekeurige software kinne ynstallearje yn in firtuele masine, haw ik gjin Docker-kontener tafoege. Wy kinne Chocolatey tafoegje as in útwreiding foar Azure DevOps. Om dit te dwaan, litte wy nei link. Klikje Krij it fergees. Folgjende, as jo al autorisearre binne, selektearje jo akkount gewoan, en sa net, doch dan itselde ding nei autorisaasje.
Hjir moatte jo selektearje wêr't wy de tafoeging sille tafoegje en klikje op de knop Ynstallearje.
Nei suksesfolle ynstallaasje, klikje Trochgean nei organisaasje:
Jo kinne no it sjabloan foar de Chocolatey-taak yn it finster sjen taken by it bewurkjen fan in konfiguraasjetriem azure-pipelines.yml:
Klikje op Chocolatey en sjoch in list mei fjilden:
Hjir moatte wy selektearje ynstallearje yn it fjild mei de teams. YN Nuspec triemnamme jouwe de namme fan it fereaske pakket oan - pvs-studio. As jo de ferzje net oantsjutte, sil de lêste ynstalleare wurde, wat ús folslein past. Lit ús op de knop drukke add en wy sille sjen de oanmakke taak yn de konfiguraasje triem.
No moatte wy in bestân meitsje mei de analyzer-lisinsje. Hjir PVSNAME и PVSKEY - nammen fan fariabelen waans wearden wy spesifisearje yn 'e ynstellings. Se sille de PVS-Studio login en lisinsjekaai opslaan. Om har wearden yn te stellen, iepenje it menu Fariabelen-> Nije fariabele. Litte wy fariabelen oanmeitsje PVSNAME foar oanmelde en PVSKEY foar de analyzer kaai. Ferjit net it fakje te kontrolearjen Hâld dizze wearde geheim foar PVSKEY. Kommando koade:
Litte wy klikke Bewarje-> Bewarje-> Run om de taak út te fieren. Litte wy it rapport downloade troch nei it ljepblêd Taken te gean.
It Chocolatey-projekt befettet allinich 37615 rigels fan C #-koade. Litte wy nei guon fan 'e fûnen flaters sjen.
Testresultaten
Warskôging N1
Analyzer warskôging: V3005 De fariabele 'Provider' wurdt oan himsels tawiisd. CrytpoHashProviderSpecs.cs 38
public abstract class CrytpoHashProviderSpecsBase : TinySpec
{
....
protected CryptoHashProvider Provider;
....
public override void Context()
{
Provider = Provider = new CryptoHashProvider(FileSystem.Object);
}
}
De analysator ûntdekt in tawizing fan 'e fariabele oan himsels, wat gjin sin hat. Meast wierskynlik, yn plak fan ien fan dizze fariabelen soe d'r in oare wêze moatte. No, of dit is in typflater, en de ekstra opdracht kin gewoan fuortsmiten wurde.
Warskôging N2
Analyzer warskôging: V3093 [CWE-480] De '&' operator evaluearret beide operanden. Miskien moat ynstee in koartsluting '&&' operator brûkt wurde. Platform.cs 64
Operator ferskil & fan de operator && is dat as de linker kant fan 'e útdrukking is falsk, dan sil de rjochterkant noch berekkene wurde, wat yn dit gefal ûnnedige metoadeoproppen betsjut system.directory_bestean.
Yn it beskôge fragmint is dit in lytse flater. Ja, dizze betingst kin optimalisearre wurde troch de &-operator te ferfangen troch de &&-operator, mar út in praktysk eachpunt hat dit neat oan. Yn oare gefallen kin betizing tusken & en && lykwols serieuze problemen feroarsaakje as de rjochterkant fan 'e útdrukking behannele wurdt mei ferkearde/ûnjildiche wearden. Bygelyks, yn ús flaterkolleksje, identifisearre mei help fan de V3093 diagnostyk, der is dit gefal:
if ((k < nct) & (s[k] != 0.0))
Sels as de yndeks k is ferkeard, sil it brûkt wurde om tagong te krijen ta in array-elemint. As gefolch, in útsûndering wurdt smiten IndexOutOfRangeException.
Yn dit gefal is d'r in frjemde logika efter de wurking fan 'e ternêre operator. Litte wy neier sjen: as de betingst foldien is dy't ik markearre haw mei nûmer 1, dan geane wy troch nei betingst 2, dat is altyd wier, wat betsjut dat rigel 3 útfierd wurdt. As betingst 1 falsk blykt te wêzen, dan geane wy nei de rigel markearre mei nûmer 4, de betingst wêryn ek altyd is wier, wat betsjut dat rigel 5 útfierd wurdt. Sa wurde de betingsten markearre mei opmerking 0 nea foldien, wat miskien net krekt de logika fan operaasje is dy't de programmeur ferwachte.
Warskôging N5
Analyzer warskôging: V3123 [CWE-783] Miskien wurket de operator '?:' op in oare manier dan ferwachte. Syn prioriteit is leger as prioriteit fan oare operators yn syn tastân. Options.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);
}
}
Sûnt de fariabele j in pear rigels boppe wurdt inisjalisearre op nul, de ternêre operator sil weromkomme de wearde falsk. Fanwegen dizze betingst sil it lichem fan 'e loop mar ien kear útfierd wurde. It liket my ta dat dit stikje koade hielendal net wurket lykas de programmeur bedoeld hat.
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);
}
....
}
....
}
D'r is hjir in frjemde geneste betingst: installedPackageVersions.Count != 1dy't altyd wêze sil wier. Faak jout sa'n warskôging in logyske flater yn 'e koade oan, en yn oare gefallen jout it gewoan oerstallige kontrôle oan.
Warskôging N7
Analyzer warskôging: V3001 D'r binne identike sub-ekspresjes 'commandArguments.contains("-apikey")' links en rjochts fan '||' operator. ArgumentsUtility.cs 42
De programmeur dy't dizze seksje koade skreau, kopiearre en plakke de lêste twa rigels en fergeat se te bewurkjen. Hjirtroch koene Chocolatey-brûkers de parameter net tapasse apikey noch in pear manieren. Fergelykber mei de boppesteande parameters kin ik de folgjende opsjes biede:
Kopiearje-plakke flaters hawwe in hege kâns op in ferskine ier of letter yn elts projekt mei in grutte hoemannichte boarne koade, en ien fan de bêste ark foar it bestriden fan harren is statyske analyze.
PS En lykas altyd hat dizze flater de neiging om te ferskinen oan 'e ein fan in multi-line betingst :). Sjoch publikaasje "Lêste line effekt".
Warskôging N8
Analyzer warskôging: V3095 [CWE-476] It 'installedPackage'-objekt waard brûkt foardat it waard ferifiearre tsjin nul. Kontrolearje rigels: 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)
{
....
}
....
}
Klassike flater: objekt earst ynstallearrePackage wurdt brûkt en dan kontrolearre foar null. Dizze diagnostyk fertelt ús oer ien fan twa problemen yn it programma: beide ynstallearrePackage nea gelyk null, dat is twifelich, en dan is de kontrôle oerstallich, of wy kinne mooglik in serieuze flater yn 'e koade krije - in besykjen om tagong te krijen ta in nulreferinsje.
konklúzje
Dat wy hawwe in oare lytse stap nommen - no is it brûken fan PVS-Studio noch makliker en handiger wurden. Ik wol ek sizze dat Chocolatey in goede pakketbehearder is mei in lyts oantal flaters yn 'e koade, dy't noch minder wêze kinne by it brûken fan PVS-Studio.
Wy noegje út скачать en besykje PVS-Studio. Regelmjittich gebrûk fan in statyske analysator sil de kwaliteit en betrouberens ferbetterje fan 'e koade dy't jo team ûntwikkelet en helpt in protte te foarkommen nul dei kwetsberens.
PS
Foar publikaasje hawwe wy it artikel stjoerd nei de Chocolatey-ûntwikkelders, en se hawwe it goed ûntfongen. Wy fûnen neat kritysk, mar se fûnen bygelyks de brek dy't wy fûn hawwe relatearre oan 'e "api-key" kaai.