Astrée and RuleChecker Release 23.10 An HTML version of these release notes is available at absint.com/releasenotes/astree/23.10 A video summary is available on the AbsInt YouTube channel at youtube.com/watch?v=sBHcJZD06gE AbsInt License Manager (ALM) All network connections between the ALM server and its clients are now TLS-encrypted, and the ALM web interface is now served via HTTPS in addition to HTTP. Upgrading your client to this release requires upgrading your ALM as well. Old client versions will continue to work with the new ALM using the non-encrypted legacy protocol, unless you block the corresponding port in your firewall. The default port for the legacy protocol is 42424, while for the new TLS connection it's 42426. A new environment variable AI_LICENSE_TLS is used to configure the license, while old versions use AI_LICENSE. This enables you to set up old and new versions to run in parallel, for example: AI_LICENSE = alm-server@42424 AI_LICENSE_TLS = alm-server@42426 The default port for the ALM web interface is 42425 for HTTP and 42427 for HTTPS. alanuncher * The tool launcher now supports scanning for installed products in arbitrary directories specified via the option --dir <path> * The launcher will now auto-discover all a³ tools located in sibling a3* directories. This enables you to unpack the product ZIP files in a directory and use the launcher of any of them to access all of them. For example, if you have a directory with a3_arm_123, a3_arm_456, and a3_c_789, you can now use the launcher in a3_c_789/bin to access all three tools. DAX changes * Removed support for the deprecated DAX preprocessor tags <strip-path/> and <replacements/>. They are no longer needed and can be removed from DAX files. * Removed the deprecated DAX option use-relative-paths. Improved precision Analysis precision has been improved for: * computations that involve bit masks * dynamic memory allocations from within C++ virtual methods * modulo operations in the congruence intervals domain * casts from float to integer in comparisons * structs assigned to self * the octagon domain when adding positive values, and on expressions that involve casts Improved C++ mode * Improved tooltips. * Integer types in alarms messages and tooltips are now displayed as (un)signed x-bit integer where x is the number of bits used to represent the type. * Regular expressions provided as arguments to the options unroll-loops-in-functions and separate-function now match entire function signatures instead of a prefix of function signatures. * Statements that are inserted via the original source annotation mechanism are now taken into account when computing the analysis coverage information. * Fixed integer signedness assumed by the C++ frontend for fields of union and struct types in the presence of inheritance. This generally improves analysis precision and corrects alarms in Astrée directives that specify bounds for the affected fields (__ASTREE_modify, __ASTREE_volatile_input, __ASTREE_known_range, __ASTREE_global_assert). Diff-based comments Introducing a new diff-based comment mechanism which, in case of code changes, identifies commented code locations by comparing the currently analyzed code with a reference from a previous analysis run. The new comment mechanism is available in all analysis modes (astree, astree-cxx, rulechecker). * Existing comments that use the comment modes AAL or pattern can be converted to the new comment mode by using a button in the toolbar of the diff comments view or the command line option --convert-to-diff-comments * The command line option --export-diff-comments <dax-file> allows exporting diff-based comments into a DAX file. Other improvements * The tooltips for displaying value ranges have been extended to all sub-expressions. For example, in an expression like x + y Astrée now also shows a tooltip for the + operator, reporting the result of the addition. * Improved reporting of ABI settings that are incompatible with the Clang frontend. * The JSON compilation database importer now resolves relative paths relative to the location of the provided JSON file instead of relative to the current working directory. * The state machine domain is now enabled by default. * The symbolic domain now handles: * relations that involve shifts, e.g. x = in >> 15; out = (in << 1) - (x << 16); // 'out' is now known to be positive for positive 'in' * complex expression that are bounded by comparisons, e.g. ((a - b - c) / d) < 8; * Improved the octagon packing heuristics to create more useful octagon packs on some code patterns. * Astrée now accepts union expressions in struct and array initializers. * The calculation of malloc contexts has new limits to ensure that it does not take too long. * Removed false alarms when using value-initialized iterators with the preprocessor option "Use abstract stubs for the C++ standard template library" enabled. * Improved the error reporting for partitioning directives. The analyzer now avoids reporting alarms that occur in the evaluation of the directive but reports more consistently when such directives are ignored completely. * Dynamically allocated memory blocks are now displayed in the global data flow view and marked as possibly shared or affected by data races when being accessed from multiple processes. * Improved performance when analyzing assignments from large smashed to non-smashed variables. * The automatic loop unroll heuristics now ignore Astrée directives when counting the number of statements in a loop. Introducing directives into loops therefore no longer influences loop unrolling decisions with respect to the option auto-unroll-size. * Accesses from multiple processes to the same global variable are no longer reported as shared if the accesses do not happen in the same phase. * Replaced the ABI option unaligned_dereference by two new Astrée semantics options: * warn-on-misaligned-dereference (default: yes) warns about misaligned dereferences * cut-misaligned-dereference (default: yes) cuts traces with misaligned dereferences from the analysis The defaults for the new options correspond to the default of the former option unaligned_dereference=error. * The directive __ASTREE_global_assert can now express that a pointer may only point to certain offsets in a variable. For example, if the pointer p may point to the fields a or b of variable v, that can be expressed as __ASTREE_global_assert((p; {&v.a, &v.b})); Fixes * Fixed the directive __ASTREE_check_separate_targets for the case that more than two arguments are given. * Fixed an issue that could cause crashes when using __ASTREE_octagon_pack with variables of pointer type and the Boolean domain enabled. * Fixed an issue that could cause the analyzer to crash when the option generate-undeclared-absolute-addresses was enabled. Toolbox for TargetLink * Fixed an issue that caused the toolbox to fail when supplying an additional DAX file via the toolbox preferences. * Improved file handling to prevent configuration errors when the same file name is found multiple times with different capitalization. * The generated preprocessor configuration now sets the combine="merge" attribute. This allows specifying additional includes and defines for the generated preprocessor configuration via an additional DAX file, as configured in the toolbox preferences. * Fixed capitalization of file names in the preprocessor configuration of AUTOSAR projects and in the generated coverage_ignore attributes. Eclipse plugin * Support for automatic includes. * Proper handling of linked files. * Improved compatibility with Astr&ecute;e 21.04i and higher when activating and deactivating checks. Rule sets and checks for C * Added support for MISRA C:2023. * Added support for rule CERT.MSC.9. Rule sets and checks specific to Astrée * Rule checks reported during run-time analysis (check phase analysis) are now reported with all analysis contexts instead of only one. * The check invalid_directive now also warns about __ASTREE_partition_calls directives that have no function call in scope. Enhancements, clarifications, refinements for both C and C++ * Fixed default argument of rule A.5.2 by listing endasm instead of end_asm. * Refined the check pragma-usage (A.5.2, AUTOSAR.16.0.1A, AUTOSAR.16.7.1A, M.3.4, M2008.16.6.1, M202x-DRAFT.000213) by restricting it to code sections included by the preprocessor. * Improved code location reported for rule violations at preprocessor directives such as #include. * Improved the alarm message for the check max-number-of-recursive-paths. It now reports which functions are involved in the recursion. * The check unary-assign-separation (AUTOSAR.5.2.10M, M.12.13, M2008.5.2.10) no longer warns about subscript operator uses in operands of increment/decrement operations. For C++, the check treats overloaded operator calls like built-in operators, in accordance with the latest interpretation of the associated rules, to remove undesired alarms. * For unused source comment/suppress directives, the check unused-suppress-directive now additionally reports the end location of the affected code area. * Reduced memory consumption when activating rule T.12.1. * RPATH now stops counting upon encountering 100 000 recursive paths, to keep the analysis runtime under control. The metrics table then displays the value as “>100000”. * The diagnostic check unused-suppressed-directive (B.1.2) can now be configured to exclude source directives that are never reached by the preprocessor. * Paths without a valid continuation (e.g. after accessing an invalid pointer) are now discarded in the analysis phase clangstaticanalyzer. This removes irrelevant alarms for all checks that run in that phase. * Merged the check non-standard-escape-sequence-pp into the check non-standard-escape-sequence (A.2.11, M.1.1, M2012.1.2, X.E.5.2.5.5). Enhancements, clarifications, refinements for C code * Removed false positives for: * cast-integer-implicit (M.10.1) and cast-float-implicit (M.10.2, X.F.27) with initializers for bit-fields and at function return * static-object-zero-initialization (AUTOSAR.3.3.2A). It no longer warns about out-of-class definitions of static data members without initializer if their in-class declaration features an initializer. * global-object-scope (CERT.DCL.15, CERT.DCL.19, M.8.10, M2012.8.7, X.B.5.5, X.F.31). Tentative definitions (without initializer) are now considered a use of the variable as well. * implicit-designation (M2012.9.2). In addition to the excluded values {0} and {0U}, arbitrary integer constants of zero value are now excluded as well ({0UL}, {0x0}, etc.). * Removed false negatives for the check global-object-scope (CERT.DCL.15, CERT.DCL.19, M.8.10, M2012.8.7, X.B.5.5, X.F.31), which did not report tentative definitions (without initializer) without further use. * Fixed calculation of the CDFUN metric for functions whose names result from function-like macro expansions. This removes false positives for the rule T.14.1 (min-comment-density-his). * The check sline-comment (M2012.3.1, M2023-C.3.1, CERT.MSC.4) is no longer reported in code that is excluded by the preprocessor. * The checks object-pointer-diff-cast and object-pointer-diff-cast-implicit (M2023-C.11.3, M2012.11.3, M.11.4) now report when a pointer to an atomic qualified object type is converted to a pointer of type char, signed char or unsigned char. * Added new checks pointer-qualifier-cast-atomic and pointer-qualifier-cast-atomic-implicit (M2023-C.11.8). * It is now possible to specify exceptions to the check sline-comment by providing a regular expression option to its associated rules (CERT.MSC.4, M2012.3.1, M2023-C.3.1). Enhancements, clarifications, refinements for C++ code * The check bad-function no longer fails on the use of non-function declarations. This removes false positives for AUTOSAR.15.5.2A, AUTOSAR.18.9.1A, AUTOSAR.26.5.1A, M202x-DRAFT.000202, M202x-DRAFT.000355, M202x-DRAFT.000226, M202x-DRAFT.000223, M202x-DRAFT.000329, CERT-CPP.CON.37C, CERT-CPP.MSC.30C, and CERT-CPP.MSC.50. * The check assignment-operator-return-type (AUTOSAR.13.2.1A) has been split into the checks assignment-operator-return-type (which allows void as return type) and assignment-operator-return-type-void. * The template instantiation stacks that are reported with rule violations now include variable templates. * Improved code location reported for violations of the check mmline-comment (AUTOSAR.2.7.1M, M2008.2.7.1, M202x-DRAFT.000025). * Removed false negatives for the check pragma-usage (A.5.2, AUTOSAR.16.0.1A, AUTOSAR.16.7.1A, M202x-DRAFT.000213, M2008.16.6.1) which did not report the use of _Pragma("..."). * Removed false positives for: * clean-global-namespace (M2008.7.3.1, AUTOSAR.7.3.1M) regarding template parameters * original-source-annotation-insertion-failed (A.CPP.5.1) when the annotation insertion targets a location that might be excluded by the preprocessor in only some translation units, e.g. due to an include guard * mixed-virtual-base (AUTOSAR.10.1.3M, M2008.10.1.3, M202x-DRAFT.000165), which sometimes failed to consider all inheritance edges * Removed false negatives for the check potentially-throwing-static-initialization (AUTOSAR.15.2.1A, CERT-CPP.ERR.58). It now also reports violations within variable template (partial) specializations. * Removed false negatives for: * bitop-type (M2008.5.0.21, AUTOSAR.5.0.21M) regarding the left-hand side of bitwise shift assignment operators <<= or >>= * shift-width-constant (M2008.5.8.1, AUTOSAR.5.8.1M) regarding the right-hand side of bitwise shift assignment operators <<= or >>= * Removed false positives and false negatives for: * underlying-cvalue-conversion (AUTOSAR.5.0.3M, M2008.5.0.3) with respect to reference types and elaborated types * underlying-narrowing-conversion (AUTOSAR.5.0.6M, M2008.5.0.6) with respect to elaborated types * underlying-signedness-conversion (AUTOSAR.5.0.4M, M2008.5.0.4) with respect to elaborated types * non-diamond-virtual-base (AUTOSAR.10.1.2M, M2008.10.1.2), which sometimes failed to consider all inheritance edges * Removed false positives and false negatives for: * using-directive-header (AUTOSAR.7.3.4M, AUTOSAR.7.3.6M, M2008.7.3.4, M2008.7.3.6) * using-directive-non-header (AUTOSAR.7.3.4M, M2008.7.3.4) * using-declaration-header (AUTOSAR.7.3.6M, M2008.7.3.6) * inaccessible-external-function (AUTOSAR.3.3.1A, M2008.3.3.1) * inaccessible-external-object (AUTOSAR.3.3.1A, M2008.3.3.1) * unused-internal-function (AUTOSAR.0.1.10M, AUTOSAR.0.1.3A, M2008.0.1.10) * unused-internal-variable (AUTOSAR.0.1.3M, M2008.0.1.3) * unnamed-namespace-header (AUTOSAR.7.3.3M, CERT-CPP.DCL.59, M2008.7.3.3) These checks now consider the locations of macro expansions instead of the locations of their definition in order to decide whether code comes from a header file. * The option allow-signed-constant-with-unsigned now only affects non-negative signed constants. This removes false negatives of the checks underlying-signedness-conversion (M2008.5.0.4, AUTOSAR.5.0.4M) and bitop-type (M2008.5.0.21, AUTOSAR.5.0.21M) when the option is enabled. * Removed false negatives of the check potentially-throwing-static-initialization (AUTOSAR.15.2.1A, CERT-CPP.ERR.58). In addition to checking for the existence of a noexcept exception specification, it now also checks the condition and thus also catches noexcept(false). * The C++ version of the check parameter-name-match (M2008.8.4.2, AUTOSAR.8.4.2M) no longer warns about mismatched parameter names between an explicit function template specialization declaration and the template declaration that is specialized. * The check function-return-unused (M2008.0.1.7, AUTOSAR.0.1.2A) now also warns when the overloaded call operator() is used with function call syntax, i.e. with (). * The check cast-integer-to-pointer (M2008.5.2.8, AUTOSAR.5.2.8M) no longer warns about conversion from integer type to function pointer. This aspect of the associated rules is now covered by the new check cast-integer-to-function-pointer. * The check inconsistent-default-argument (M2008.8.3.1, AUTOSAR.8.3.1M) now treats non-constant expression as having different values. The associated rules are thereby decidable and now fully covered. * Removed false negatives for the check ambiguous-identifiers (AUTOSAR.2.10.1M, M2008.2.10.1) for identifiers introduced by friend declarations. Server and server controller * All network connections between analysis servers and clients are now TLS-encrypted. * The Astrée server now supports external authentication via authorization servers compatible with OAuth 2.0 or OpenID Connect (OIDC). * The list of user names is now displayed in alphabetical order in the server controller. * It is now possible to specify in the server controller that newly created analyses be private by default. * It is now possible to limit the number of concurrent analyses for an analysis server in that server’s configuration, using any of the following: * the server command line option --concurrent-analyses-limit <int> * the server controller command line option --set-concurrent-analyses-limit <int> * the server controller GUI option "Maximum number of concurrent analyses" Client GUI, batch mode, and report files * The client now warns about the automatic conversion when importing AAF files from older versions. For AAF files generated from release 23.10i onwards, it also points out which Astrée version to use in order to prevent the conversion. * Fixed handling of modification state during project loading, to prevent unintentional modification of analysis data when triggering a project save operation while loading. * The batch mode option --report-only can now also be used for generating reports from AAF files. * Original source annotations for C++ code can now be disabled/enabled from the "Original Source Annotations" view. * The call graph view now shows more detailed alarm counters and the analysis time spent per function. * The context menu of graph nodes now offers actions for folding subtrees and displaying all callers and callees of a function. * The custom report file configuration dialog now supports file selection by folder structure, just like the Filter view. * Pressing the "Import to project" button of the compilation database importer now closes the corresponding dialog after importing the generated preprocessor configuration. * Fixed an issue that prevented the proper import of AAF files on Linux when the files had been exported on Windows using release 23.04 or 23.04i. * The New Project Wizard allows to configure the files to be used for the analysis by extracting the information from a compilation database. * Improved the tree view for preprocessed and original source files in the left sidebar. Chains of directories are now collapsed into a single line when appropriate. * Improved the tree view for files in Results -> Filter. The file paths are now collapsed if possible, to offer a more compact view. * Added a new predefined report @data-races that lists the affected variables together with the corresponding alarms about the data races. * Findings that concern original source annotations for C++ can now be commented. * Fixed the upload of ARXML and OIL files to the analysis server, which was not possible in version 23.04i. * Fixed an issue that prevented exclusion of a file from rule checking if the file appeared in a line directive with a relative path that contained a symbolic link. Frontends and preprocessor * Improved performance of the C frontend for Astrée analysis projects. * Fixed the reporting of location information for source-level comment and suppress directives in the /* Semantic hypotheses */ and /* Further directives */ sections of the output view and text report. * The directive __ASTREE_attributes(()) can now also be used in files that do not require preprocessing, such as the 'Wrapper and Stubs File'. * Improved reporting of invalid AAL directives, which no longer are reported as an error, but as a violation of diagnostic rule A.5.4 (check annotation-insertion-failed). * Improved the robustness of pattern comments with regard to code changes. * In the wrapper and stubs file, the use of extended identifiers (such as var@fun@"file.c") is no longer restricted to Astrée directives only. The syntax can now be used everywhere in that file. Stub libraries, ABIs, OS and compiler configurations * Generalized the ARINC653 OS stubs and added support for the PikeOS personality. Deviations from the ARINC653 defaults can be configured by adding specific defines to preprocessor configurations, as indicated in the user manual. * Improved the stub libraries with respect to POSIX coverage and precision when analyzing C++. * Added abstract versions of std::vector and std::string to the C++ STL stubs for Astrée. The abstract version of std::vector does not allow the use of low-level pointer arithmetic on the underlying representation, e.g. using the pointer returned by data(). The abstract version of std::string supports efficient analysis of strings up to a total capacity of 100 bytes. API calls that exceed this limit raise an alarm and their effects are ignored. * Changed the default of the ABI setting enum_preferred_sign from signed to unsigned. This change also corrects the following target ABIs with respect to the preferred sign for enums: 32-bit Intel x86 64-bit x86 32-bit ARM v6 and higher, ARM compiler, little endian 32-bit ARM v4 or v5, ARM compiler, little endian 16-bit C166, Tasking C166/ST10 compiler * The target ABI "16-bit C166, Tasking c166/ST10 Compiler" now uses enum_preferred_size=best to match the actual platform behavior. * Modified the AUTOSAR stubs to allow ISRs to interrupt each other when "ISRs may be nested" is set but no priorities for ISRs are specified. * Fixed frontend errors when using the deque, forward_list, or list implementations of the abstract stubs for the C++ STL library. Qualification Support Kits * The TOR now include a general requirements section, as well as a section about input files and formats. * TOR descriptions are now more consistent and precise. New test cases in the Astrée QSK qk_rule_a_cpp_4_1 qk_rule_a_cpp_5_1 qk_rule_a_cpp_7_1 qk_rule_a_cpp_7_2 qk_rule_m2023_c_1_3 qk_rule_m2023_c_2_1 qk_rule_m2023_c_9_1 qk_rule_m2023_c_12_2 qk_rule_m2023_c_14_3 qk_rule_m2023_c_18_1 qk_rule_m2023_c_18_6 qk_rule_m2023_c_19_1 qk_rule_m2023_c_22_1 qk_rule_m2023_c_d_4_7 qk_rule_m2023_c_d_4_13 qk_rule_m2023_c_d_5_1 qk_rule_m2023_c_d_5_2 qk_check_class_inconsistent_definitions qk_check_deadlock qk_check_definition_duplicate qk_check_multiple_atomic_accesses_between_sequence_points qk_check_original_source_annotation_insertion_failed qk_check_return_implicit qk_check_unreachable_code_invariant qk_check_unsequenced_modification qk_commandline_export_entry_functions qk_option_cut_misaligned_dereference qk_option_precise_multiple_return_function qk_option_unroll_loops_in_function qk_option_warn_on_misaligned_dereference The test case qk_abi_unaligned_derefence has been removed from the Astrée QSK. Astrée QSK test cases extended to C++ qk_option_analysis_timeout qk_option_auto_unroll qk_option_auto_unroll_size qk_option_automatic_octagon_packing qk_option_cache_iterates qk_option_congruence_intervals qk_option_dump_data_dictionary qk_option_dump_dataflow qk_option_dump_escaping_locals qk_option_dynamic_smash_threshold qk_option_dynamic_smash_const_threshold qk_option_dynamic_smash_variables_threshold qk_option_equality qk_option_fields_in_octagon_packs qk_option_fold_contiguous_fields qk_option_global_iteration_limit qk_option_global_iteration_limit_per_phase qk_option_inner_unroll qk_option_interproc_oct_packs qk_option_log_iter qk_option_log_time qk_option_log_parallel_iter qk_option_main_unroll qk_option_max_finite_int_set_size qk_option_max_oct_pack_size qk_option_narrow qk_option_octagon qk_option_octagon_epsilon qk_option_print_packs qk_option_print_widening_parameters qk_option_relational qk_option_smash_const_threshold qk_option_separate_function qk_option_shutdown_timeout qk_option_smash_threshold qk_option_state_machine qk_option_symb qk_option_text_report_tables qk_option_warn_on_control_flow_anomaly qk_option_warn_on_explicit_integer_cast_ranges qk_option_warn_on_implicit_integer_cast_ranges qk_option_warn_on_integer_arith_ranges qk_option_warn_on_signed_integer_lshift_ranges qk_option_widening_with_thresholds New test cases in the RuleChecker QSK qk_check_atomic_member_access qk_check_atomic_void qk_check_cast_integer_to_function_pointer qk_check_chained_designation qk_check_character_constant qk_check_deprecated_declarations qk_check_deprecated_exception_specification qk_check_deprecated_implicit_copy qk_check_deprecated_implicit_copy_with_destructor qk_check_enable_bounds_checking_interfaces qk_check_header_filename qk_check_implementation_filename qk_check_invalid_thread_object_use qk_check_long_double qk_check_memory_order qk_check_multiple_atomic_accesses_between_sequence_points qk_check_pointer_qualifier_cast_atomic qk_check_pointer_qualifier_cast_atomic_implicit qk_check_pointer_to_vla qk_check_source_character_set qk_check_stdint_constant_macro_small qk_check_string_literal qk_check_unreachable_code_invariant qk_check_thread_resource_storage_duration qk_check_volatile qk_check_wchar_t qk_check_wide_string_literal qk_rule_a_cpp_4_1 qk_rule_a_cpp_7_1 qk_rule_a_cpp_7_2 qk_rule_autosar_0_4_4a qk_rule_autosar_1_1_1a qk_rule_autosar_2_3_1a qk_rule_autosar_2_7_1a qk_rule_autosar_2_11_1a qk_rule_autosar_2_13_3a qk_rule_autosar_2_13_4a qk_rule_autosar_2_13_6a qk_rule_autosar_3_1_2a qk_rule_autosar_3_1_3a qk_rule_cert_msc_9 qk_rule_m2023_c_d_1_1 qk_rule_m2023_c_d_2_1 qk_rule_m2023_c_d_3_1 qk_rule_m2023_c_d_4_1 qk_rule_m2023_c_d_4_2 qk_rule_m2023_c_d_4_3 qk_rule_m2023_c_d_4_5 qk_rule_m2023_c_d_4_6 qk_rule_m2023_c_d_4_7 qk_rule_m2023_c_d_4_8 qk_rule_m2023_c_d_4_9 qk_rule_m2023_c_d_4_10 qk_rule_m2023_c_d_4_11 qk_rule_m2023_c_d_4_12 qk_rule_m2023_c_d_4_13 qk_rule_m2023_c_d_4_14 qk_rule_m2023_c_1_1 qk_rule_m2023_c_1_2 qk_rule_m2023_c_1_3 qk_rule_m2023_c_1_4 qk_rule_m2023_c_1_5 qk_rule_m2023_c_2_1 qk_rule_m2023_c_2_2 qk_rule_m2023_c_2_3 qk_rule_m2023_c_2_4 qk_rule_m2023_c_2_5 qk_rule_m2023_c_2_6 qk_rule_m2023_c_2_7 qk_rule_m2023_c_2_8 qk_rule_m2023_c_3_1 qk_rule_m2023_c_3_2 qk_rule_m2023_c_4_1 qk_rule_m2023_c_4_2 qk_rule_m2023_c_5_1 qk_rule_m2023_c_5_2 qk_rule_m2023_c_5_3 qk_rule_m2023_c_5_4 qk_rule_m2023_c_5_5 qk_rule_m2023_c_5_6 qk_rule_m2023_c_5_7 qk_rule_m2023_c_5_8 qk_rule_m2023_c_5_9 qk_rule_m2023_c_6_1 qk_rule_m2023_c_6_2 qk_rule_m2023_c_6_3 qk_rule_m2023_c_7_1 qk_rule_m2023_c_7_2 qk_rule_m2023_c_7_3 qk_rule_m2023_c_7_4 qk_rule_m2023_c_7_5 qk_rule_m2023_c_7_6 qk_rule_m2023_c_8_1 qk_rule_m2023_c_8_2 qk_rule_m2023_c_8_3 qk_rule_m2023_c_8_4 qk_rule_m2023_c_8_5 qk_rule_m2023_c_8_6 qk_rule_m2023_c_8_7 qk_rule_m2023_c_8_8 qk_rule_m2023_c_8_9 qk_rule_m2023_c_8_10 qk_rule_m2023_c_8_11 qk_rule_m2023_c_8_12 qk_rule_m2023_c_8_13 qk_rule_m2023_c_8_14 qk_rule_m2023_c_8_15 qk_rule_m2023_c_8_16 qk_rule_m2023_c_8_17 qk_rule_m2023_c_9_1 qk_rule_m2023_c_9_2 qk_rule_m2023_c_9_3 qk_rule_m2023_c_9_4 qk_rule_m2023_c_9_5 qk_rule_m2023_c_9_6 qk_rule_m2023_c_10_1 qk_rule_m2023_c_10_2 qk_rule_m2023_c_10_3 qk_rule_m2023_c_10_4 qk_rule_m2023_c_10_5 qk_rule_m2023_c_10_6 qk_rule_m2023_c_10_7 qk_rule_m2023_c_10_8 qk_rule_m2023_c_11_1 qk_rule_m2023_c_11_2 qk_rule_m2023_c_11_3 qk_rule_m2023_c_11_4 qk_rule_m2023_c_11_5 qk_rule_m2023_c_11_6 qk_rule_m2023_c_11_7 qk_rule_m2023_c_11_8 qk_rule_m2023_c_11_9 qk_rule_m2023_c_11_10 qk_rule_m2023_c_12_1 qk_rule_m2023_c_12_2 qk_rule_m2023_c_12_3 qk_rule_m2023_c_12_4 qk_rule_m2023_c_12_5 qk_rule_m2023_c_12_6 qk_rule_m2023_c_13_1 qk_rule_m2023_c_13_2 qk_rule_m2023_c_13_3 qk_rule_m2023_c_13_4 qk_rule_m2023_c_13_5 qk_rule_m2023_c_13_6 qk_rule_m2023_c_14_1 qk_rule_m2023_c_14_2 qk_rule_m2023_c_14_3 qk_rule_m2023_c_14_4 qk_rule_m2023_c_15_1 qk_rule_m2023_c_15_2 qk_rule_m2023_c_15_3 qk_rule_m2023_c_15_4 qk_rule_m2023_c_15_5 qk_rule_m2023_c_15_6 qk_rule_m2023_c_15_7 qk_rule_m2023_c_16_1 qk_rule_m2023_c_16_2 qk_rule_m2023_c_16_3 qk_rule_m2023_c_16_4 qk_rule_m2023_c_16_5 qk_rule_m2023_c_16_6 qk_rule_m2023_c_16_7 qk_rule_m2023_c_17_1 qk_rule_m2023_c_17_2 qk_rule_m2023_c_17_3 qk_rule_m2023_c_17_4 qk_rule_m2023_c_17_5 qk_rule_m2023_c_17_6 qk_rule_m2023_c_17_7 qk_rule_m2023_c_17_8 qk_rule_m2023_c_17_9 qk_rule_m2023_c_17_10 qk_rule_m2023_c_17_11 qk_rule_m2023_c_17_12 qk_rule_m2023_c_17_13 qk_rule_m2023_c_18_1 qk_rule_m2023_c_18_2 qk_rule_m2023_c_18_3 qk_rule_m2023_c_18_4 qk_rule_m2023_c_18_5 qk_rule_m2023_c_18_6 qk_rule_m2023_c_18_7 qk_rule_m2023_c_18_8 qk_rule_m2023_c_18_9 qk_rule_m2023_c_18_10 qk_rule_m2023_c_19_1 qk_rule_m2023_c_19_2 qk_rule_m2023_c_20_1 qk_rule_m2023_c_20_2 qk_rule_m2023_c_20_3 qk_rule_m2023_c_20_4 qk_rule_m2023_c_20_5 qk_rule_m2023_c_20_6 qk_rule_m2023_c_20_7 qk_rule_m2023_c_20_8 qk_rule_m2023_c_20_9 qk_rule_m2023_c_20_10 qk_rule_m2023_c_20_11 qk_rule_m2023_c_20_12 qk_rule_m2023_c_20_13 qk_rule_m2023_c_20_14 qk_rule_m2023_c_21_1 qk_rule_m2023_c_21_2 qk_rule_m2023_c_21_3 qk_rule_m2023_c_21_4 qk_rule_m2023_c_21_5 qk_rule_m2023_c_21_6 qk_rule_m2023_c_21_7 qk_rule_m2023_c_21_8 qk_rule_m2023_c_21_9 qk_rule_m2023_c_21_10 qk_rule_m2023_c_21_11 qk_rule_m2023_c_21_12 qk_rule_m2023_c_21_13 qk_rule_m2023_c_21_14 qk_rule_m2023_c_21_15 qk_rule_m2023_c_21_16 qk_rule_m2023_c_21_17 qk_rule_m2023_c_21_18 qk_rule_m2023_c_21_19 qk_rule_m2023_c_21_20 qk_rule_m2023_c_21_21 qk_rule_m2023_c_21_22 qk_rule_m2023_c_21_23 qk_rule_m2023_c_21_24 qk_rule_m2023_c_21_25 qk_rule_m2023_c_22_1 qk_rule_m2023_c_22_2 qk_rule_m2023_c_22_3 qk_rule_m2023_c_22_4 qk_rule_m2023_c_22_5 qk_rule_m2023_c_22_6 qk_rule_m2023_c_22_7 qk_rule_m2023_c_22_8 qk_rule_m2023_c_22_9 qk_rule_m2023_c_22_10 qk_rule_m2023_c_22_12 qk_rule_m2023_c_22_13 qk_rule_m2023_c_23_1 qk_rule_m2023_c_23_2 qk_rule_m2023_c_23_3 qk_rule_m2023_c_23_4 qk_rule_m2023_c_23_5 qk_rule_m2023_c_23_6 qk_rule_m2023_c_23_8 The test case qk_abi_unaligned_derefence has been removed from the RuleChecker QSK. RuleChecker QSK test cases extended to C++ qk_check_sline_splicing qk_check_literal_assignment qk_check_universal_character_name ------------------------------------------------------------------------------ Last updated on 27 October 2023 by alex@absint.com. Copyright 2023 AbsInt. ------------------------------------------------------------------------------ An HTML version of these release notes is available at absint.com/releasenotes/astree/23.10 A video summary is available on the AbsInt YouTube channel at youtube.com/watch?v=sBHcJZD06gE