PVS-Studio for Cを䜿甚したGitLabでのマヌゞ芁求の分析

image1.png


GitLabが奜きで、バグが嫌いですか゜ヌスコヌドの品質を向䞊させたいですかその埌、あなたは正しい堎所に来たした。今日は、マヌゞ芁求をチェックするためにPVS-Studio Cアナラむザヌをセットアップする方法を説明したす。すべおのナニコヌンムヌドず楜しい読曞。



PVS-Studioは、C、C ++、C、およびJavaで蚘述されたプログラムの゜ヌスコヌドの゚ラヌず朜圚的な脆匱性を怜出するためのツヌルです。Windows、Linux、macOSの64ビットシステムで動䜜したす。32ビット、64ビット、および組み蟌みARMプラットフォヌムのコヌドを分析できたす。



ちなみに、PVS-Studio 7.08をリリヌスしたしたが、面癜いこずがたくさんありたす。䟋えば



  • LinuxおよびmacOS甚のCアナラむザヌ。
  • ラむダヌ甚プラグむン;
  • ファむルのリストをチェックするための新しいモヌド。


ファむルリストチェックモヌド



以前は、特定のファむルをチェックするために、ファむルのリストを含む.xmlをパヌサヌに枡す必芁がありたした。しかし、あたり䟿利ではないため、.txtを転送する機胜を远加したした。これにより、䜜業が倧幅に簡玠化されたす。



特定のファむルをチェックするには、-sourceFiles-fフラグを指定し、ファむルのリストずずもに.txtを枡す必芁がありたす。次のようになりたす。



pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json


コミットたたはプルリク゚ストのチェックを構成するこずに関心がある堎合は、このモヌドを䜿甚しお構成するこずもできたす。違いは、分析甚のファむルのリストを取埗するこずであり、䜿甚しおいるシステムによっお異なりたす。



マヌゞリク゚スト怜蚌の原則



チェックの芁点は、アナラむザヌによっお怜出された問題が、マヌゞ䞭にマスタヌブランチに到達しないこずです。たた、プロゞェクト党䜓を毎回分析する必芁はありたせん。さらに、ブランチをマヌゞするず、倉曎されたファむルのリストがありたす。したがっお、マヌゞ芁求のチェックを远加するこずをお勧めしたす。



静的アナラむザヌを実装する前のマヌゞ芁求は次のようになりたす。



image2.png


぀たり、倉曎ブランチにあったすべおの゚ラヌはマスタヌブランチに送られたす。これは望たしくないので、分析を远加するず、図は次のようになりたす。



image3.png


私たちは分析しchanges2を゚ラヌがない堎合、我々はそうでない堎合、我々はそれを拒吊し、マヌゞ芁求を受け入れ、そしお。



ちなみに、C / C ++のコミットずプルリク゚ストの分析に興味がある堎合は、ここでそれに぀いお読むこずができたす。



Gitlab



GitLabは、オヌプン゜ヌスのWebベヌスのDevOpsラむフサむクルツヌルであり、独自のwiki、バグトラッカヌ、CI / CDパむプラむンなどを備えたGitのコヌドリポゞトリ管理システムを提䟛したす。



マヌゞリク゚ストの分析の実装を開始する前に、プロゞェクトを登録しおアップロヌドする必芁がありたす。これを行う方法がわからない堎合は、同僚による蚘事をお勧めしたす。



泚意..。以䞋に説明する環境蚭定方法は、その1぀です。目暙は、分析に必芁な環境をセットアップし、アナラむザヌを実行するための手順を瀺すこずです。おそらく、あなたの堎合、環境の準備リポゞトリの远加、アナラむザのむンス​​トヌルず分析の段階を分離する方が最適です。たずえば、必芁な環境でDockerむメヌゞを準備しお䜿甚する、たたはその他の方法です。



これから䜕が起こるかをよりよく理解するために、次の図を参照するこずをお勧めしたす。



image4.png


アナラむザヌが機胜するには.NETCore SDK 3が必芁であるため、アナラむザヌをむンストヌルする前に、アナラむザヌに必芁な䟝存関係をむンストヌルするMicrosoftリポゞトリヌを远加する必芁がありたす。さたざたなLinuxディストリビュヌション甚のMicrosoftリポゞトリの远加に぀いおは、察応するドキュメントで説明されおいたす。



パッケヌゞマネヌゞャを介しおPVS-Studioをむンストヌルするには、PVS-Studioリポゞトリも远加する必芁がありたす。さたざたなディストリビュヌションのリポゞトリの远加に぀いおは、ドキュメントの察応するセクションで詳しく説明しおいたす。



アナラむザヌを操䜜するには、ラむセンスキヌが必芁です。アナラむザヌのダりンロヌドペヌゞでトラむアルラむセンスを取埗できたす。



泚意..。説明されおいる動䜜モヌドマヌゞ芁求の分析には、゚ンタヌプラむズラむセンスが必芁であるこずに泚意しおください。したがっお、この操䜜モヌドを詊す堎合は、[メッセヌゞ]フィヌルドに゚ンタヌプラむズラむセンスが必芁であるこずを忘れずに指定しおください。



マヌゞ芁求が発生した堎合は、倉曎されたファむルのリストのみを分析する必芁がありたす。それ以倖の堎合は、すべおのファむルを分析したす。分析埌、ログを必芁な圢匏に倉換する必芁がありたす。



これで、䜜業のアルゎリズムが目の前にあるので、スクリプトの䜜成に進むこずができたす。これを行うには、.gitlab-ci.ymlファむルを倉曎するか、そうでない堎合は䜜成する必芁がありたす。それを䜜成するには、プロゞェクトの名前をクリックする必芁がありたす-> CI / CDを蚭定したす。



image5.png


これで、スクリプトを䜜成する準備が敎いたした。たず、アナラむザヌをむンストヌルしおラむセンスを入力するコヌドを蚘述したしょう。



before_script:
  - apt-get update && apt-get -y install wget gnupg 

  - apt-get -y install git
  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update
  
  - wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
  - wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
  - apt-get update
  - apt-get -y install pvs-studio-dotnet

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
  - dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln


むンストヌルずアクティブ化は他のすべおのスクリプトの前に行う必芁があるため、特別なbefore_scriptラベルを䜿甚したす。この断片に぀いお少し説明したす。



アナラむザヌのむンストヌルの準備



  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update


PVS-Studioリポゞトリずアナラむザヌの远加



  - wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
  - wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
  - apt-get update
  - apt-get -y install pvs-studio-dotnet


ラむセンスのアクティブ化



  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY


$ PVS_NAME-ナヌザヌ名。



$ PVS_KEY-補品キヌ。



プロゞェクトの䟝存関係を埩元したす。$ CI_PROJECT_DIRはプロゞェクトディレクトリぞのフルパスです。



  - dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln


正しく分析するには、プロゞェクトを正垞にビルドし、その䟝存関係を埩元する必芁がありたすたずえば、必芁なNuGetパッケヌゞをロヌドする必芁がありたす。



あなたはをクリックしお、ラむセンス情報を含む環境倉数を蚭定するこずができたす蚭定し、その埌のCI / CD。



image6.png


私たちが芋぀け、開いたりィンドりで倉数項目を、右偎に、をクリックしお展開し、ボタンや倉数を远加したす。結果は次のようになりたす。



image7.png


これで、分析に進むこずができたす。たず、完党な分析のためのスクリプトを远加したしょう。フラグ-tは゜リュヌションぞのパスを転送し、フラグ-oは分析結果が蚘録されおいるファむルの曞き蟌み堎所です。リタヌンコヌドにも関心がありたす。この堎合、分析䞭に譊告が発行されたずいう情報がリタヌンコヌドに含たれおいるずきに操䜜が終了するこずに関心がありたす。このスニペットは次のようになりたす。



job:
  script:
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o 
PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi


リタヌンコヌドはビットマスクのように機胜したす。たずえば、分析の結果ずしお譊告が発行された堎合、リタヌンコヌドは8になりたす。ラむセンスの有効期限が1か月以内の堎合、リタヌンコヌドは4になりたす。分析䞭に゚ラヌが芋぀かり、ラむセンスの有効期限が1か月以内の堎合、コヌドは4になりたす。戻り倀、䞡方の倀が曞き蟌たれたす数倀を合蚈しお、最終的な戻りコヌド-8 + 4 = 12を取埗したす。したがっお、察応するビットをチェックするこずにより、分析䞭にさたざたな状態に関する情報を取埗できたす。リタヌンコヌドの詳现に぀いおは、ドキュメント「PVS-Studioを䜿甚したコマンドラむンからのVisual Studio / MSBuild / .NETCoreプロゞェクトの確認」の「pvs-studio-dotnetLinux / macOSリタヌンコヌド」セクションを参照しおください。



この堎合、すべおのリタヌンコヌドに関心がありたす。ここで8が衚瀺されたす。



  - exit_code=$((($exit_code & 8)/8))


戻りコヌドに関心のある数倀のビットが含たれおいる堎合は1を取埗し、それ以倖の堎合は0を取埗し



たす。マヌゞ芁求の解析を远加するずきが来たした。これを行う前に、スクリプトの堎所を準備したしょう。マヌゞ芁求が発生したずきにのみ実行する必芁がありたす。次のようになりたす。



merge:
  script:
  only:
  - merge_requests


スクリプト自䜓に移りたしょう。仮想マシンがオリゞン/マスタヌに぀いお䜕も知らないずいう事実に遭遇したした。したがっお、私たちは圌女を少し助けたす



  - git fetch origin


次に、ブランチ間の違いを取埗しお、結果をtxtファむルに保存したしょう。



  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt


ここで、$ CI_COMMIT_SHAは最埌のコミットのハッシュです。



次に、-fフラグを䜿甚しおファむルのリストの分析を実行したす。受信した以前の.txtファむルを転送したす。さお、完党な分析ずの類掚によっお、リタヌンコヌドを芋おください



  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi


マヌゞ芁求をチェックするための完党なスクリプトは次のようになりたす。



merge:
  script:
  - git fetch origin
  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  only:
  - merge_requests


すべおのスクリプトが実行された埌、ログの倉換を远加するだけです。after_scriptラベルずplog-converterナヌティリティを䜿甚したす。



after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json


plog-converter ナヌティリティは、アナラむザの゚ラヌレポヌトをHTMLなどのさたざたな圢匏に倉換するために䜿甚されるオヌプン゜ヌスプロゞェクトです。ナヌティリティの詳现に぀いおは、ドキュメントの察応するセクションのサブセクション「PlogConverterナヌティリティ」を参照しおください。



ちなみに、IDEからロヌカルで.jsonレポヌトを䟿利に操䜜したい堎合は、IDERider甚のプラグむンをお勧めしたす。その䜿甚法に぀いおは、察応するドキュメントで詳しく説明されおいたす。



䟿宜䞊、ここに.gitlab-ci.yml党䜓を瀺したす。



image: debian

before_script:
  - apt-get update && apt-get -y install wget gnupg 

  - apt-get -y install git
  - wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  - dpkg -i packages-microsoft-prod.deb
  - apt-get update
  - apt-get install apt-transport-https
  - apt-get update
  
  - wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
  - wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
  - apt-get update
  - apt-get -y install pvs-studio-dotnet

  - pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
  - dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln

merge:
  script:
  - git fetch origin
  - git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f 
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  only:
  - merge_requests

job:
  script:
  - exit_code=0
  - pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o 
PVS-Studio.json || exit_code=$?
  - exit_code=$((($exit_code & 8)/8))
  - if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
  
after_script:
  - plog-converter -t html -o eLog ./PVS-Studio.json


すべおがファむルに远加されたら、[倉曎のコミット]をクリックしたす。すべおが正しいこずを確認するには、CI / CD- > Pipelines- > Runningに移動したす。仮想マシンりィンドりが開き、最埌に次のようになりたす。



image8.png


Jobが成功したの を芋たした-成功、すべおが順調です。これで、行ったこずをテストできたす。



仕事の䟋



䜜業の䟋ずしお、耇数のファむルが存圚する単玔なプロゞェクトmaster内を䜜成しおみたしょう。その埌、別のブランチで、1぀のファむルのみを倉曎し、マヌゞ芁求を䜜成しようずしたす。



倉曎されたファむルに゚ラヌが含たれおいる堎合ず含たれおいない堎合の2぀のケヌスを考えおみたす。たず、゚ラヌのある䟋。



マスタヌブランチに゚ラヌを含たないProgram.csファむルがあり、別のブランチで、開発者が゚ラヌのあるコヌドを远加し、マヌゞ芁求を䜜成したいずしたす。圌がどのような間違いを犯したかはそれほど重芁ではありたせん。䞻なこずはそれが存圚するずいうこずです。たずえば、私はスロヌ挔算子を忘れたしたはい、圌らはずおも間違っおいたす



void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}


゚ラヌのある䟋を分析した結果を芋おみたしょう。たた、1぀のファむルのみが解析されるようにするために、pvs-studio-dotnet起動行に-rフラグを远加したした。



image9.png


アナラむザヌが゚ラヌを怜出し、ブランチのマヌゞを蚱可しなかったこずがわかりたす。



゚ラヌなしで䟋を確認したす。コヌドの修正



void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}


マヌゞ芁求分析の結果



image10.png


ご芧のずおり、゚ラヌは怜出されず、タスクの実行は成功したした。これを確認したいず思いたす。



結論



ブランチをマヌゞする前に䞍良コヌドを陀倖するこずは非垞に䟿利で楜しいです。したがっお、CI / CDを䜿甚しおいる堎合は、テスト甚に静的アナラむザヌを組み蟌んでみおください。さらに、これは非垞に簡単に行われたす。



枅聎ありがずうございたした。





この蚘事を英語を話す聎衆ず共有したい堎合は、翻蚳リンクNikolayMironovを䜿甚しおください。PVS-Studio for Cを䜿甚したGitLabでのマヌゞ芁求の分析。



All Articles