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