Polyspace 解析の MATLAB からのトラブルシューティング
C/C++ コードに対して Polyspace® 解析を実行する際、1 つ以上のファイルのコンパイルが失敗する場合、解析は残りのファイルで続行されます。コンパイル エラーで解析を停止するようにできます。
proj = polyspace.Project; proj.Configuration.EnvironmentSettings.StopWithCompileError = true;
ただし、解析を完了して、すべてのコンパイル エラーを見つけるほうが便利です。
コンパイル エラーは、MATLAB® コマンド ウィンドウに示される解析ログに表示されます。解析ログには、使用されたオプションと、解析のさまざまな段階も含まれます。エラーを示す行は文字列 Error:
で始まります。スキャンが容易になるように、これらの行を検索して、ログ ファイルに抽出します。コンパイル エラーの発生を示す警告を生成します。
前提条件
MATLAB から Polyspace を実行する前に、Polyspace インストールと MATLAB インストールをリンクしなければなりません。MATLAB や Simulink との Polyspace の統合を参照してください。
エラー ログでの Polyspace 解析エラーのキャプチャ
後で定義する関数 runPolyspace
は、関数 evalc
を使用してコマンド ウィンドウから出力をキャプチャし、error.log
ファイルに Error:
から始まる行を保存します。ソース フォルダーおよびインクルード フォルダーのパスを指定して runPolyspace
を呼び出すことができます。
たとえば、MATLAB インストール フォルダーのサブフォルダー polyspace/examples/cxx/Bug_Finder_Example/sources
に含まれているデモ ソース ファイルへのパスを指定して関数を呼び出すことができます。
sourcePath = fullfile(polyspaceroot, 'polyspace', ... 'examples', 'cxx', 'Bug_Finder_Example', 'sources'); includePath = fullfile(polyspaceroot, 'polyspace', ... 'examples', 'cxx', 'Bug_Finder_Example', 'sources'); [status, resultsSummary] = runPolyspace(sourcePath, includePath);
関数は次のように定義されます。
function [status, resultsSummary] = runPolyspace(sourcePath, libPath) % runPolyspace takes two string arguments: source and include folder. % The files in the source folder are analyzed for defects. % If one or more files fail to compile, the errors are saved in a log. % A warning on the screen indicates that compilation errors occurred. proj = polyspace.Project; % Specify sources proj.Configuration.Sources = {fullfile(sourcePath,'*')}; % Specify compiler and paths to libraries proj.Configuration.TargetCompiler.Compiler = 'gnu4.9'; proj.Configuration.EnvironmentSettings.IncludeFolders = {fullfile(libPath,'*')}; % Run analysis runMode = 'bugFinder'; [logFileContent,status] = evalc('run(proj, runMode)'); % Open file for writing errors errorFile = fopen('error.log','wt+'); % Check log file for compilation errors numErrors = 0; log = strsplit(logFileContent,'\n'); errorLines = find(contains(log, {'Error:'}, 'IgnoreCase', true)); for ii=1:numel(errorLines) fprintf(errorFile, '%s\n', log{errorLines(ii)}); numErrors = numErrors + 1; end if numErrors warning('%d compilation error(s). See error.log for details.', numErrors); end fclose(errorFile); % Read results resObj = proj.Results; resultsSummary = getSummary(resObj, 'defects'); end
解析ログは、ファイル Polyspace_R20
にもキャプチャされます。コマンド ウィンドウの出力をキャプチャする代わりに、このファイルを検索できます。##n
_ProjectName
_date
-time
.log
このスクリプトは他の目的に適応させることができます。たとえば、エラーに加えて警告をキャプチャできます。警告を含む行は Warning:
で始まります。警告は、問題があるにもかかわらず解析が続行される状況を示します。解析では、問題を回避することを仮定します。仮定が誤っている場合、後でエラーが表示されるか、まれに誤った解析結果になることがあります。