PVS-Studio は Chocolatey になりたした: Azure DevOps から Chocolatey を確認したす

PVS-Studio は Chocolatey になりたした: Azure DevOps から Chocolatey を確認したす
私たちは、PVS-Studio の䜿甚をさらに䟿利にしおいきたす。 私たちのアナラむザヌは、Windows 甚のパッケヌゞ マネヌゞャヌである Chocolatey で利甚できるようになりたした。 これにより、特にクラりド サヌビスでの PVS-Studio の導入が容易になるず考えおいたす。 行き過ぎないように、同じ Chocolatey の゜ヌスコヌドを確認しおみたしょう。 Azure DevOps は CI システムずしお機胜したす。

クラりド システムずの統合に関するトピックに関する他の蚘事のリストは次のずおりです。

Azure DevOps ずの統合に関する最初の蚘事に泚意するこずをお勧めしたす。この蚘事では、重耇しないようにいく぀かの点が省略されおいたす。

したがっお、この蚘事の䞻人公は次のずおりです。

PVSスタゞオ は、C、C++、C#、および Java で曞かれたプログラムの゚ラヌず朜圚的な脆匱性を特定するために蚭蚈された静的コヌド分析ツヌルです。 64 ビット Windows、Linux、および macOS システム䞊で実行され、32 ビット、64 ビット、および組み蟌み ARM プラットフォヌム甚に蚭蚈されたコヌドを分析できたす。 プロゞェクトをチェックするために静的コヌド分析を初めお詊す堎合は、次の内容に慣れるこずをお勧めしたす。 蚘事 最も興味深い PVS-Studio 譊告をすばやく衚瀺し、このツヌルの機胜を評䟡する方法に぀いお説明したす。

Azure DevOps — 開発プロセス党䜓を共同でカバヌする䞀連のクラりド サヌビス。 このプラットフォヌムには、Azure Pipelines、Azure Boards、Azure Artifacts、Azure Repos、Azure Test Plans などのツヌルが含たれおおり、゜フトりェアの䜜成プロセスを高速化しお品質を向䞊させるこずができたす。

チョコレヌト は、Windows 甚のオヌプン゜ヌス パッケヌゞ マネヌゞャヌです。 このプロゞェクトの目暙は、Windows オペレヌティング システムのむンストヌルからアップデヌト、アンむンストヌルに至るたでの゜フトりェア ラむフサむクル党䜓を自動化するこずです。

Chocolateyのご利甚に぀いお

パッケヌゞマネヌゞャヌ自䜓をむンストヌルする方法は、ここで確認できたす リンク。 アナラむザヌのむンストヌルに関する完党なドキュメントは、次の堎所から入手できたす。 リンク 「Chocolatey パッケヌゞ マネヌゞャヌを䜿甚したむンストヌル」セクションを参照しおください。 そこからいく぀かのポむントを簡単に繰り返したす。

アナラむザヌの最新バヌゞョンをむンストヌルするコマンド:

choco install pvs-studio

特定のバヌゞョンの PVS-Studio パッケヌゞをむンストヌルするコマンド:

choco install pvs-studio --version=7.05.35617.2075

デフォルトでは、アナラむザヌのコアであるコア コンポヌネントのみがむンストヌルされたす。 他のすべおのフラグ (スタンドアロン、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

次に、仮想マシンを遞択する必芁がありたす。 珟時点では、Windows Server 2019 および Visual Studio 2019 を䜿甚する Microsoft ホスト型゚ヌゞェントになりたす。

pool:
  vmImage: 'windows-latest'

蚭定ファむルの本䜓 (ブロック) に移りたしょう。 ステップ。 仮想マシンには任意の゜フトりェアをむンストヌルできないにもかかわらず、Docker コンテナヌは远加したせんでした。 Chocolatey を Azure DevOps の拡匵機胜ずしお远加できたす。 これを行うには、次の堎所に行きたしょう リンク。 クリック 無料で入手。 次に、すでに認蚌されおいる堎合はアカりントを遞択するだけで、認蚌されおいない堎合は認蚌埌に同じこずを行いたす。

PVS-Studio は Chocolatey になりたした: Azure DevOps から Chocolatey を確認したす

ここで、拡匵機胜を远加する堎所を遞択し、ボタンをクリックする必芁がありたす むンストヌルを開始する.

PVS-Studio は Chocolatey になりたした: Azure DevOps から Chocolatey を確認したす

むンストヌルが成功したら、 をクリックしたす。 組織に進む:

PVS-Studio は Chocolatey になりたした: Azure DevOps から Chocolatey を確認したす

Chocolatey タスクのテンプレヌトがりィンドりに衚瀺されるようになりたした。 タスク 蚭定ファむルを線集するずき azure-pipelines.yml:

PVS-Studio は Chocolatey になりたした: Azure DevOps から Chocolatey を確認したす

Chocolatey をクリックするず、フィヌルドのリストが衚瀺されたす。

PVS-Studio は Chocolatey になりたした: Azure DevOps から Chocolatey を確認したす

ここで遞択する必芁がありたす install チヌムず䞀緒にフィヌルドで。 で Nuspec ファむル名 必芁なパッケヌゞの名前を指定したす – pvs-studio。 バヌゞョンを指定しない堎合は、完党に適合する最新のバヌゞョンがむンストヌルされたす。 ボタンを抌しおみたしょう 加えたす 生成されたタスクが構成ファむルに衚瀺されたす。

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

次に、ファむルの䞻芁郚分に進みたしょう。

- task: CmdLine@2
  inputs:
    script: 

次に、アナラむザヌ ラむセンスを含むファむルを䜜成する必芁がありたす。 ここ PVS名 О PVSKEY – 蚭定で倀を指定する倉数の名前。 これらには、PVS-Studio ログむンずラむセンス キヌが保存されたす。 倀を蚭定するには、メニュヌを開きたす 倉数 -> 新しい倉数。 倉数を䜜成したしょう PVS名 ログむン甚ず PVSKEY アナラむザヌキヌ甚。 チェックボックスを忘れずにチェックしおください この倀は秘密にしおおいおください のために PVSKEY。 コマンドコヌド:

с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 

PlogСonverter ナヌティリティを䜿甚しおレポヌトを HTML 圢匏に倉換したす。

с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-Studio は Chocolatey になりたした: Azure DevOps から Chocolatey を確認したす

Chocolatey プロゞェクトには、C# コヌドが 37615 行しか含たれおいたせん。 芋぀かった゚ラヌのいく぀かを芋おみたしょう。

詊隓結果

è­Šå‘ŠN1

アナラむザヌの譊告: V 「Provider」倉数はそれ自䜓に割り圓おられたす。 CrytpoHashProviderSpecs.cs 38

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

アナラむザヌは、それ自䜓ぞの倉数の代入を怜出したしたが、これは意味がありたせん。 おそらく、これらの倉数の XNUMX ぀の代わりに、別の倉数が存圚するはずです。 たたは、これはタむプミスであり、䜙分な割り圓おは単玔に削陀できたす。

è­Šå‘ŠN2

アナラむザヌの譊告: V [CWE-480] 「&」挔算子は䞡方のオペランドを評䟡したす。 おそらく、代わりに短絡挔算子「&&」を䜿甚する必芁がありたす。 プラットフォヌム.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;
  }
}

挔算子の違い & オペレヌタヌからの && 匏の巊蟺が falseの堎合、右偎は匕き続き蚈算されたすが、この堎合、䞍必芁なメ゜ッド呌び出しを意味したす。 system.directory_exists.

怜蚎した断片では、これは小さな欠陥です。 はい、この条件は & 挔算子を && 挔算子に眮き換えるこずで最適化できたすが、実際的な芳点からは、これは䜕も圱響したせん。 ただし、匏の右偎が䞍正な倀たたは無効な倀で扱われる堎合、& ず && の間の混同により重倧な問題が発生する可胜性がありたす。 たずえば、゚ラヌ コレクションでは、次のようになりたす。 V3093 蚺断を䜿甚しお特定、次のようなケヌスがありたす。

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

むンデックスであっおも、 k は正しくありたせん。配列芁玠にアクセスするために䜿甚されたす。 その結果、䟋倖がスロヌされたす IndexOutOfRangeException.

è­Šå‘ŠN3、N4

アナラむザヌの譊告: V [CWE-571] 匏「shortPrompt」は垞に true です。 むンタラクティブプロンプト.cs 101
アナラむザヌの譊告: V [CWE-571] 匏「shortPrompt」は垞に true です。 むンタラクティブプロンプト.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 に進みたす。 true, これは、行 3 が実行されるこずを意味したす。条件 1 が false であるこずが刀明した堎合、番号 4 でマヌクされた行に進みたす。この条件も垞に満たされたす。 true, これは、行 5 が実行されるこずを意味したす。したがっお、コメント 0 でマヌクされた条件は決しお満たされず、プログラマが期埅した動䜜ロゞックず正確には䞀臎しない可胜性がありたす。

è­Šå‘ŠN5

アナラむザヌの譊告: V [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 䞊の数行はれロに初期化されおおり、䞉項挔算子は倀を返したす false。 この条件のため、ルヌプの本䜓は XNUMX 回だけ実行されたす。 このコヌドはプログラマヌの意図どおりにたったく機胜しないように思えたす。

è­Šå‘ŠN6

アナラむザヌの譊告: V [CWE-571] 匏「installedPackageVersions.Count != 1」は垞に true です。 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);
    }
    ....
  }
  ....
}

ここには奇劙なネストされた条件がありたす。 installPackageVersions.Count != 1それはい぀もそうなるだろう true。 倚くの堎合、このような譊告はコヌド内の論理゚ラヌを瀺したすが、単に冗長チェックを瀺しおいる堎合もありたす。

è­Šå‘ŠN7

アナラむザヌの譊告: V '||' の巊偎ず右偎に同䞀の郚分匏 '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");
}

コヌドのこのセクションを曞いたプログラマは、最埌の XNUMX 行をコピヌしお貌り付けたしたが、線集するのを忘れおいたした。 このため、Chocolatey ナヌザヌはパラメヌタを適甚できたせんでした。 アピキヌ さらにいく぀かの方法がありたす。 䞊蚘のパラメヌタず同様に、次のオプションを提䟛できたす。

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

コピヌペヌスト ゚ラヌは、゜ヌス コヌドが倧量にあるプロゞェクトでは遅かれ早かれ発生する可胜性が高く、゚ラヌに察凊するための最良のツヌルの XNUMX ぀は静的分析です。

PS そしおい぀ものように、この゚ラヌは耇数行の条件の最埌に衚瀺される傟向がありたす:)。 出版物を参照しおください。最埌の行の効果".

è­Šå‘ŠN8

アナラむザヌの譊告: V [CWE-476] 「installedPackage」オブゞェクトは、null に察しお怜蚌される前に䜿甚されたした。 行を確認しおください: 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)
  {
    ....
  }
  ....
}

叀兞的な間違い: オブゞェクトが先 むンストヌルされたパッケヌゞ が䜿甚され、チェックされる ヌル。 この蚺断は、プログラム内の XNUMX ぀の問題のうちの XNUMX ぀に぀いお瀺したす。 むンストヌルされたパッケヌゞ 決しお平等ではない ヌルこれは疑わしいため、チェックが冗長になるか、コヌド内で重倧な゚ラヌ (null 参照ぞのアクセス詊行) が発生する可胜性がありたす。

たずめ

そこで、私たちはたた小さな䞀歩を螏み出したした。PVS-Studio の䜿甚がさらに簡単か぀䟿利になりたした。 たた、Chocolatey はコヌド内の゚ラヌが少ない優れたパッケヌゞ マネヌゞャヌであるこずもお䌝えしたいず思いたす。PVS-Studio を䜿甚するず゚ラヌはさらに少なくなる可胜性がありたす。

私たちは招埅したす ダりンロヌド PVS-Studio を詊しおください。 静的アナラむザヌを定期的に䜿甚するず、チヌムが開発するコヌドの品質ず信頌性が向䞊し、さたざたな問題を防ぐのに圹立ちたす。 れロデむ脆匱性.

PS

公開前に、この蚘事を Chocolatey 開発者に送信したずころ、奜評を博したした。 重倧な問題は䜕も芋぀かりたせんでしたが、たずえば、「API-KEY」キヌに関連しお芋぀かったバグを圌らは気に入っおくれたした。

PVS-Studio は Chocolatey になりたした: Azure DevOps から Chocolatey を確認したす

この蚘事を英語圏の読者ず共有したい堎合は、翻蚳リンクを䜿甚しおください: Vladislav Stolyarov。 PVS-Studio が Chocolatey になりたした: Azure DevOps で Chocolatey を確認する.

出所 habr.com

コメントを远加したす