メインコンテンツ

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: で始まります。警告は、問題があるにもかかわらず解析が続行される状況を示します。解析では、問題を回避することを仮定します。仮定が誤っている場合、後でエラーが表示されるか、まれに誤った解析結果になることがあります。

参考

トピック