xref: /llvm-project/clang/docs/analyzer/user-docs/CrossTranslationUnit.rst (revision 5674a3c88088e668b684326c2194a6282e8270ff)
16d3bb71cSGabor Marton=====================================
26d3bb71cSGabor MartonCross Translation Unit (CTU) Analysis
36d3bb71cSGabor Marton=====================================
46d3bb71cSGabor Marton
56d3bb71cSGabor MartonNormally, static analysis works in the boundary of one translation unit (TU).
65cc18516SEndre FülöpHowever, with additional steps and configuration we can enable the analysis to inline the definition of a function from
75cc18516SEndre Fülöpanother TU.
86d3bb71cSGabor Marton
96d3bb71cSGabor Marton.. contents::
106d3bb71cSGabor Marton   :local:
116d3bb71cSGabor Marton
125cc18516SEndre FülöpOverview
135cc18516SEndre Fülöp________
145cc18516SEndre FülöpCTU analysis can be used in a variety of ways. The importing of external TU definitions can work with pre-dumped PCH
155cc18516SEndre Fülöpfiles or generating the necessary AST structure on-demand, during the analysis of the main TU. Driving the static
165cc18516SEndre Fülöpanalysis can also be implemented in multiple ways. The most direct way is to specify the necessary commandline options
175cc18516SEndre Fülöpof the Clang frontend manually (and generate the prerequisite dependencies of the specific import method by hand). This
185cc18516SEndre Fülöpprocess can be automated by other tools, like `CodeChecker <https://github.com/Ericsson/codechecker>`_ and scan-build-py
195cc18516SEndre Fülöp(preference for the former).
20435b458aSEndre Fülöp
215cc18516SEndre FülöpPCH-based analysis
225cc18516SEndre Fülöp__________________
235cc18516SEndre FülöpThe analysis needs the PCH dumps of all the translations units used in the project.
245cc18516SEndre FülöpThese can be generated by the Clang Frontend itself, and must be arranged in a specific way in the filesystem.
255cc18516SEndre FülöpThe index, which maps symbols' USR names to PCH dumps containing them must also be generated by the
265cc18516SEndre Fülöp`clang-extdef-mapping`. Entries in the index *must* have an `.ast` suffix if the goal
275cc18516SEndre Fülöpis to use PCH-based analysis, as the lack of that extension signals that the entry is to be used as a source-file, and parsed on-demand.
285cc18516SEndre FülöpThis tool uses a :doc:`compilation database <../../JSONCompilationDatabase>` to
295cc18516SEndre Fülöpdetermine the compilation flags used.
305cc18516SEndre FülöpThe analysis invocation must be provided with the directory which contains the dumps and the mapping files.
315cc18516SEndre Fülöp
325cc18516SEndre Fülöp
335cc18516SEndre FülöpManual CTU Analysis
345cc18516SEndre Fülöp###################
356d3bb71cSGabor MartonLet's consider these source files in our minimal example:
366d3bb71cSGabor Marton
376d3bb71cSGabor Marton.. code-block:: cpp
386d3bb71cSGabor Marton
396d3bb71cSGabor Marton  // main.cpp
406d3bb71cSGabor Marton  int foo();
416d3bb71cSGabor Marton
426d3bb71cSGabor Marton  int main() {
436d3bb71cSGabor Marton    return 3 / foo();
446d3bb71cSGabor Marton  }
456d3bb71cSGabor Marton
466d3bb71cSGabor Marton.. code-block:: cpp
476d3bb71cSGabor Marton
486d3bb71cSGabor Marton  // foo.cpp
496d3bb71cSGabor Marton  int foo() {
506d3bb71cSGabor Marton    return 0;
516d3bb71cSGabor Marton  }
526d3bb71cSGabor Marton
536d3bb71cSGabor MartonAnd a compilation database:
546d3bb71cSGabor Marton
556d3bb71cSGabor Marton.. code-block:: bash
566d3bb71cSGabor Marton
576d3bb71cSGabor Marton  [
586d3bb71cSGabor Marton    {
596d3bb71cSGabor Marton      "directory": "/path/to/your/project",
606d3bb71cSGabor Marton      "command": "clang++ -c foo.cpp -o foo.o",
616d3bb71cSGabor Marton      "file": "foo.cpp"
626d3bb71cSGabor Marton    },
636d3bb71cSGabor Marton    {
646d3bb71cSGabor Marton      "directory": "/path/to/your/project",
656d3bb71cSGabor Marton      "command": "clang++ -c main.cpp -o main.o",
666d3bb71cSGabor Marton      "file": "main.cpp"
676d3bb71cSGabor Marton    }
686d3bb71cSGabor Marton  ]
696d3bb71cSGabor Marton
706d3bb71cSGabor MartonWe'd like to analyze `main.cpp` and discover the division by zero bug.
715cc18516SEndre FülöpIn order to be able to inline the definition of `foo` from `foo.cpp` first we have to generate the `AST` (or `PCH`) file
725cc18516SEndre Fülöpof `foo.cpp`:
736d3bb71cSGabor Marton
746d3bb71cSGabor Marton.. code-block:: bash
756d3bb71cSGabor Marton
766d3bb71cSGabor Marton  $ pwd $ /path/to/your/project
776d3bb71cSGabor Marton  $ clang++ -emit-ast -o foo.cpp.ast foo.cpp
786d3bb71cSGabor Marton  $ # Check that the .ast file is generated:
796d3bb71cSGabor Marton  $ ls
806d3bb71cSGabor Marton  compile_commands.json  foo.cpp.ast  foo.cpp  main.cpp
816d3bb71cSGabor Marton  $
826d3bb71cSGabor Marton
835cc18516SEndre FülöpThe next step is to create a CTU index file which holds the `USR` name and location of external definitions in the
849f902542SElla Masource files in format `<USR-Length>:<USR> <File-Path>`:
856d3bb71cSGabor Marton
866d3bb71cSGabor Marton.. code-block:: bash
876d3bb71cSGabor Marton
886d3bb71cSGabor Marton  $ clang-extdef-mapping -p . foo.cpp
899f902542SElla Ma  9:c:@F@foo# /path/to/your/project/foo.cpp
906d3bb71cSGabor Marton  $ clang-extdef-mapping -p . foo.cpp > externalDefMap.txt
916d3bb71cSGabor Marton
926d3bb71cSGabor MartonWe have to modify `externalDefMap.txt` to contain the name of the `.ast` files instead of the source files:
936d3bb71cSGabor Marton
946d3bb71cSGabor Marton.. code-block:: bash
956d3bb71cSGabor Marton
966d3bb71cSGabor Marton  $ sed -i -e "s/.cpp/.cpp.ast/g" externalDefMap.txt
976d3bb71cSGabor Marton
986d3bb71cSGabor MartonWe still have to further modify the `externalDefMap.txt` file to contain relative paths:
996d3bb71cSGabor Marton
1006d3bb71cSGabor Marton.. code-block:: bash
1016d3bb71cSGabor Marton
1026d3bb71cSGabor Marton  $ sed -i -e "s|$(pwd)/||g" externalDefMap.txt
1036d3bb71cSGabor Marton
1046d3bb71cSGabor MartonNow everything is available for the CTU analysis.
1056d3bb71cSGabor MartonWe have to feed Clang with CTU specific extra arguments:
1066d3bb71cSGabor Marton
1076d3bb71cSGabor Marton.. code-block:: bash
1086d3bb71cSGabor Marton
1096d3bb71cSGabor Marton  $ pwd
1106d3bb71cSGabor Marton  /path/to/your/project
1115cc18516SEndre Fülöp  $ clang++ --analyze \
1125cc18516SEndre Fülöp      -Xclang -analyzer-config -Xclang experimental-enable-naive-ctu-analysis=true \
1135cc18516SEndre Fülöp      -Xclang -analyzer-config -Xclang ctu-dir=. \
1145cc18516SEndre Fülöp      -Xclang -analyzer-output=plist-multi-file \
1155cc18516SEndre Fülöp      main.cpp
1166d3bb71cSGabor Marton  main.cpp:5:12: warning: Division by zero
1176d3bb71cSGabor Marton    return 3 / foo();
1186d3bb71cSGabor Marton           ~~^~~~~~~
1196d3bb71cSGabor Marton  1 warning generated.
1206d3bb71cSGabor Marton  $ # The plist file with the result is generated.
1215cc18516SEndre Fülöp  $ ls -F
1226d3bb71cSGabor Marton  compile_commands.json  externalDefMap.txt  foo.ast  foo.cpp  foo.cpp.ast  main.cpp  main.plist
1236d3bb71cSGabor Marton  $
1246d3bb71cSGabor Marton
1255cc18516SEndre FülöpThis manual procedure is error-prone and not scalable, therefore to analyze real projects it is recommended to use
1265cc18516SEndre Fülöp`CodeChecker` or `scan-build-py`.
1276d3bb71cSGabor Marton
1286d3bb71cSGabor MartonAutomated CTU Analysis with CodeChecker
1295cc18516SEndre Fülöp#######################################
1306d3bb71cSGabor MartonThe `CodeChecker <https://github.com/Ericsson/codechecker>`_ project fully supports automated CTU analysis with Clang.
1316d3bb71cSGabor MartonOnce we have set up the `PATH` environment variable and we activated the python `venv` then it is all it takes:
1326d3bb71cSGabor Marton
1336d3bb71cSGabor Marton.. code-block:: bash
1346d3bb71cSGabor Marton
1356d3bb71cSGabor Marton  $ CodeChecker analyze --ctu compile_commands.json -o reports
1365cc18516SEndre Fülöp  $ ls -F
1375cc18516SEndre Fülöp  compile_commands.json  foo.cpp  foo.cpp.ast  main.cpp  reports/
1386d3bb71cSGabor Marton  $ tree reports
1396d3bb71cSGabor Marton  reports
1406d3bb71cSGabor Marton  ├── compile_cmd.json
1416d3bb71cSGabor Marton  ├── compiler_info.json
1426d3bb71cSGabor Marton  ├── foo.cpp_53f6fbf7ab7ec9931301524b551959e2.plist
1436d3bb71cSGabor Marton  ├── main.cpp_23db3d8df52ff0812e6e5a03071c8337.plist
1446d3bb71cSGabor Marton  ├── metadata.json
1456d3bb71cSGabor Marton  └── unique_compile_commands.json
1466d3bb71cSGabor Marton
1476d3bb71cSGabor Marton  0 directories, 6 files
1486d3bb71cSGabor Marton  $
1496d3bb71cSGabor Marton
1506d3bb71cSGabor MartonThe `plist` files contain the results of the analysis, which may be viewed with the regular analysis tools.
1516d3bb71cSGabor MartonE.g. one may use `CodeChecker parse` to view the results in command line:
1526d3bb71cSGabor Marton
1536d3bb71cSGabor Marton.. code-block:: bash
1546d3bb71cSGabor Marton
1556d3bb71cSGabor Marton  $ CodeChecker parse reports
1566d3bb71cSGabor Marton  [HIGH] /home/egbomrt/ctu_mini_raw_project/main.cpp:5:12: Division by zero [core.DivideZero]
1576d3bb71cSGabor Marton    return 3 / foo();
1586d3bb71cSGabor Marton             ^
1596d3bb71cSGabor Marton
1606d3bb71cSGabor Marton  Found 1 defect(s) in main.cpp
1616d3bb71cSGabor Marton
1626d3bb71cSGabor Marton
1636d3bb71cSGabor Marton  ----==== Summary ====----
1646d3bb71cSGabor Marton  -----------------------
1656d3bb71cSGabor Marton  Filename | Report count
1666d3bb71cSGabor Marton  -----------------------
1676d3bb71cSGabor Marton  main.cpp |            1
1686d3bb71cSGabor Marton  -----------------------
1696d3bb71cSGabor Marton  -----------------------
1706d3bb71cSGabor Marton  Severity | Report count
1716d3bb71cSGabor Marton  -----------------------
1726d3bb71cSGabor Marton  HIGH     |            1
1736d3bb71cSGabor Marton  -----------------------
1746d3bb71cSGabor Marton  ----=================----
1756d3bb71cSGabor Marton  Total number of reports: 1
1766d3bb71cSGabor Marton  ----=================----
1776d3bb71cSGabor Marton
1786d3bb71cSGabor MartonOr we can use `CodeChecker parse -e html` to export the results into HTML format:
1796d3bb71cSGabor Marton
1806d3bb71cSGabor Marton.. code-block:: bash
1816d3bb71cSGabor Marton
1826d3bb71cSGabor Marton  $ CodeChecker parse -e html -o html_out reports
1836d3bb71cSGabor Marton  $ firefox html_out/index.html
1846d3bb71cSGabor Marton
1856d3bb71cSGabor MartonAutomated CTU Analysis with scan-build-py (don't do it)
1865cc18516SEndre Fülöp#############################################################
1875cc18516SEndre FülöpWe actively develop CTU with CodeChecker as the driver for this feature, `scan-build-py` is not actively developed for CTU.
1885cc18516SEndre Fülöp`scan-build-py` has various errors and issues, expect it to work only with the very basic projects only.
1896d3bb71cSGabor Marton
1906d3bb71cSGabor MartonExample usage of scan-build-py:
1916d3bb71cSGabor Marton
1926d3bb71cSGabor Marton.. code-block:: bash
1936d3bb71cSGabor Marton
1946d3bb71cSGabor Marton  $ /your/path/to/llvm-project/clang/tools/scan-build-py/bin/analyze-build --ctu
1956d3bb71cSGabor Marton  analyze-build: Run 'scan-view /tmp/scan-build-2019-07-17-17-53-33-810365-7fqgWk' to examine bug reports.
1966d3bb71cSGabor Marton  $ /your/path/to/llvm-project/clang/tools/scan-view/bin/scan-view /tmp/scan-build-2019-07-17-17-53-33-810365-7fqgWk
1976d3bb71cSGabor Marton  Starting scan-view at: http://127.0.0.1:8181
1986d3bb71cSGabor Marton    Use Ctrl-C to exit.
1996d3bb71cSGabor Marton  [6336:6431:0717/175357.633914:ERROR:browser_process_sub_thread.cc(209)] Waited 5 ms for network service
2006d3bb71cSGabor Marton  Opening in existing browser session.
2016d3bb71cSGabor Marton  ^C
2026d3bb71cSGabor Marton  $
2035cc18516SEndre Fülöp
2047c6f5b7fSKristóf Umann.. _ctu-on-demand:
2057c6f5b7fSKristóf Umann
2065cc18516SEndre FülöpOn-demand analysis
2075cc18516SEndre Fülöp__________________
2085cc18516SEndre FülöpThe analysis produces the necessary AST structure of external TUs during analysis. This requires the
2095cc18516SEndre Fülöpexact compiler invocations for each TU, which can be generated by hand, or by tools driving the analyzer.
2105cc18516SEndre FülöpThe compiler invocation is a shell command that could be used to compile the TU-s main source file.
2115cc18516SEndre FülöpThe mapping from absolute source file paths of a TU to lists of compilation command segments used to
2125cc18516SEndre Fülöpcompile said TU are given in YAML format referred to as `invocation list`, and must be passed as an
213*5674a3c8SGabriel Ravieranalyzer-config argument.
2145cc18516SEndre FülöpThe index, which maps function USR names to source files containing them must also be generated by the
2155cc18516SEndre Fülöp`clang-extdef-mapping`. Entries in the index must *not* have an `.ast` suffix if the goal
2165cc18516SEndre Fülöpis to use On-demand analysis, as that extension signals that the entry is to be used as an PCH-dump.
2175cc18516SEndre FülöpThe mapping of external definitions implicitly uses a
2185cc18516SEndre Fülöp:doc:`compilation database <../../JSONCompilationDatabase>` to determine the compilation flags used.
2195cc18516SEndre FülöpThe analysis invocation must be provided with the directory which contains the mapping
2205cc18516SEndre Fülöpfiles, and the `invocation list` which is used to determine compiler flags.
2215cc18516SEndre Fülöp
2225cc18516SEndre Fülöp
2235cc18516SEndre FülöpManual CTU Analysis
2245cc18516SEndre Fülöp###################
2255cc18516SEndre Fülöp
2265cc18516SEndre FülöpLet's consider these source files in our minimal example:
2275cc18516SEndre Fülöp
2285cc18516SEndre Fülöp.. code-block:: cpp
2295cc18516SEndre Fülöp
2305cc18516SEndre Fülöp  // main.cpp
2315cc18516SEndre Fülöp  int foo();
2325cc18516SEndre Fülöp
2335cc18516SEndre Fülöp  int main() {
2345cc18516SEndre Fülöp    return 3 / foo();
2355cc18516SEndre Fülöp  }
2365cc18516SEndre Fülöp
2375cc18516SEndre Fülöp.. code-block:: cpp
2385cc18516SEndre Fülöp
2395cc18516SEndre Fülöp  // foo.cpp
2405cc18516SEndre Fülöp  int foo() {
2415cc18516SEndre Fülöp    return 0;
2425cc18516SEndre Fülöp  }
2435cc18516SEndre Fülöp
2445cc18516SEndre FülöpThe compilation database:
2455cc18516SEndre Fülöp
2465cc18516SEndre Fülöp.. code-block:: bash
2475cc18516SEndre Fülöp
2485cc18516SEndre Fülöp  [
2495cc18516SEndre Fülöp    {
2505cc18516SEndre Fülöp      "directory": "/path/to/your/project",
2515cc18516SEndre Fülöp      "command": "clang++ -c foo.cpp -o foo.o",
2525cc18516SEndre Fülöp      "file": "foo.cpp"
2535cc18516SEndre Fülöp    },
2545cc18516SEndre Fülöp    {
2555cc18516SEndre Fülöp      "directory": "/path/to/your/project",
2565cc18516SEndre Fülöp      "command": "clang++ -c main.cpp -o main.o",
2575cc18516SEndre Fülöp      "file": "main.cpp"
2585cc18516SEndre Fülöp    }
2595cc18516SEndre Fülöp  ]
2605cc18516SEndre Fülöp
2615cc18516SEndre FülöpThe `invocation list`:
2625cc18516SEndre Fülöp
2635cc18516SEndre Fülöp.. code-block:: bash
2645cc18516SEndre Fülöp
2655cc18516SEndre Fülöp  "/path/to/your/project/foo.cpp":
2665cc18516SEndre Fülöp    - "clang++"
2675cc18516SEndre Fülöp    - "-c"
2685cc18516SEndre Fülöp    - "/path/to/your/project/foo.cpp"
2695cc18516SEndre Fülöp    - "-o"
2705cc18516SEndre Fülöp    - "/path/to/your/project/foo.o"
2715cc18516SEndre Fülöp
2725cc18516SEndre Fülöp  "/path/to/your/project/main.cpp":
2735cc18516SEndre Fülöp    - "clang++"
2745cc18516SEndre Fülöp    - "-c"
2755cc18516SEndre Fülöp    - "/path/to/your/project/main.cpp"
2765cc18516SEndre Fülöp    - "-o"
2775cc18516SEndre Fülöp    - "/path/to/your/project/main.o"
2785cc18516SEndre Fülöp
2795cc18516SEndre FülöpWe'd like to analyze `main.cpp` and discover the division by zero bug.
2805cc18516SEndre FülöpAs we are using On-demand mode, we only need to create a CTU index file which holds the `USR` name and location of
2819f902542SElla Maexternal definitions in the source files in format `<USR-Length>:<USR> <File-Path>`:
2825cc18516SEndre Fülöp
2835cc18516SEndre Fülöp.. code-block:: bash
2845cc18516SEndre Fülöp
2855cc18516SEndre Fülöp  $ clang-extdef-mapping -p . foo.cpp
2869f902542SElla Ma  9:c:@F@foo# /path/to/your/project/foo.cpp
2875cc18516SEndre Fülöp  $ clang-extdef-mapping -p . foo.cpp > externalDefMap.txt
2885cc18516SEndre Fülöp
2895cc18516SEndre FülöpNow everything is available for the CTU analysis.
2905cc18516SEndre FülöpWe have to feed Clang with CTU specific extra arguments:
2915cc18516SEndre Fülöp
2925cc18516SEndre Fülöp.. code-block:: bash
2935cc18516SEndre Fülöp
2945cc18516SEndre Fülöp  $ pwd
2955cc18516SEndre Fülöp  /path/to/your/project
2965cc18516SEndre Fülöp  $ clang++ --analyze \
2975cc18516SEndre Fülöp      -Xclang -analyzer-config -Xclang experimental-enable-naive-ctu-analysis=true \
2985cc18516SEndre Fülöp      -Xclang -analyzer-config -Xclang ctu-dir=. \
2995cc18516SEndre Fülöp      -Xclang -analyzer-config -Xclang ctu-invocation-list=invocations.yaml \
3005cc18516SEndre Fülöp      -Xclang -analyzer-output=plist-multi-file \
3015cc18516SEndre Fülöp      main.cpp
3025cc18516SEndre Fülöp  main.cpp:5:12: warning: Division by zero
3035cc18516SEndre Fülöp    return 3 / foo();
3045cc18516SEndre Fülöp           ~~^~~~~~~
3055cc18516SEndre Fülöp  1 warning generated.
3065cc18516SEndre Fülöp  $ # The plist file with the result is generated.
3075cc18516SEndre Fülöp  $ ls -F
3085cc18516SEndre Fülöp  compile_commands.json  externalDefMap.txt  foo.cpp  main.cpp  main.plist
3095cc18516SEndre Fülöp  $
3105cc18516SEndre Fülöp
3115cc18516SEndre FülöpThis manual procedure is error-prone and not scalable, therefore to analyze real projects it is recommended to use
3125cc18516SEndre Fülöp`CodeChecker` or `scan-build-py`.
3135cc18516SEndre Fülöp
3145cc18516SEndre FülöpAutomated CTU Analysis with CodeChecker
3155cc18516SEndre Fülöp#######################################
3165cc18516SEndre FülöpThe `CodeChecker <https://github.com/Ericsson/codechecker>`_ project fully supports automated CTU analysis with Clang.
3175cc18516SEndre FülöpOnce we have set up the `PATH` environment variable and we activated the python `venv` then it is all it takes:
3185cc18516SEndre Fülöp
3195cc18516SEndre Fülöp.. code-block:: bash
3205cc18516SEndre Fülöp
3215cc18516SEndre Fülöp  $ CodeChecker analyze --ctu --ctu-ast-loading-mode on-demand compile_commands.json -o reports
3225cc18516SEndre Fülöp  $ ls -F
3235cc18516SEndre Fülöp  compile_commands.json  foo.cpp main.cpp  reports/
3245cc18516SEndre Fülöp  $ tree reports
3255cc18516SEndre Fülöp  reports
3265cc18516SEndre Fülöp  ├── compile_cmd.json
3275cc18516SEndre Fülöp  ├── compiler_info.json
3285cc18516SEndre Fülöp  ├── foo.cpp_53f6fbf7ab7ec9931301524b551959e2.plist
3295cc18516SEndre Fülöp  ├── main.cpp_23db3d8df52ff0812e6e5a03071c8337.plist
3305cc18516SEndre Fülöp  ├── metadata.json
3315cc18516SEndre Fülöp  └── unique_compile_commands.json
3325cc18516SEndre Fülöp
3335cc18516SEndre Fülöp  0 directories, 6 files
3345cc18516SEndre Fülöp  $
3355cc18516SEndre Fülöp
3365cc18516SEndre FülöpThe `plist` files contain the results of the analysis, which may be viewed with the regular analysis tools.
3375cc18516SEndre FülöpE.g. one may use `CodeChecker parse` to view the results in command line:
3385cc18516SEndre Fülöp
3395cc18516SEndre Fülöp.. code-block:: bash
3405cc18516SEndre Fülöp
3415cc18516SEndre Fülöp  $ CodeChecker parse reports
3425cc18516SEndre Fülöp  [HIGH] /home/egbomrt/ctu_mini_raw_project/main.cpp:5:12: Division by zero [core.DivideZero]
3435cc18516SEndre Fülöp    return 3 / foo();
3445cc18516SEndre Fülöp             ^
3455cc18516SEndre Fülöp
3465cc18516SEndre Fülöp  Found 1 defect(s) in main.cpp
3475cc18516SEndre Fülöp
3485cc18516SEndre Fülöp
3495cc18516SEndre Fülöp  ----==== Summary ====----
3505cc18516SEndre Fülöp  -----------------------
3515cc18516SEndre Fülöp  Filename | Report count
3525cc18516SEndre Fülöp  -----------------------
3535cc18516SEndre Fülöp  main.cpp |            1
3545cc18516SEndre Fülöp  -----------------------
3555cc18516SEndre Fülöp  -----------------------
3565cc18516SEndre Fülöp  Severity | Report count
3575cc18516SEndre Fülöp  -----------------------
3585cc18516SEndre Fülöp  HIGH     |            1
3595cc18516SEndre Fülöp  -----------------------
3605cc18516SEndre Fülöp  ----=================----
3615cc18516SEndre Fülöp  Total number of reports: 1
3625cc18516SEndre Fülöp  ----=================----
3635cc18516SEndre Fülöp
3645cc18516SEndre FülöpOr we can use `CodeChecker parse -e html` to export the results into HTML format:
3655cc18516SEndre Fülöp
3665cc18516SEndre Fülöp.. code-block:: bash
3675cc18516SEndre Fülöp
3685cc18516SEndre Fülöp  $ CodeChecker parse -e html -o html_out reports
3695cc18516SEndre Fülöp  $ firefox html_out/index.html
3705cc18516SEndre Fülöp
3715cc18516SEndre FülöpAutomated CTU Analysis with scan-build-py (don't do it)
3725cc18516SEndre Fülöp#######################################################
3735cc18516SEndre FülöpWe actively develop CTU with CodeChecker as the driver for feature, `scan-build-py` is not actively developed for CTU.
3745cc18516SEndre Fülöp`scan-build-py` has various errors and issues, expect it to work only with the very basic projects only.
3755cc18516SEndre Fülöp
3765cc18516SEndre FülöpCurrently On-demand analysis is not supported with `scan-build-py`.
377