Repository navigation
SCST: Improve static analysis integration and clean up warnings - #429
Merged
Merged
Conversation
Cppcheck configuration exploration reports syntaxError at
TRACE_MEM("HIGHMEM page allocated, no clustering") in the SCST_HIGHMEM
branch. The statement is missing its semicolon, and the guard refers
to an undeclared page.
Check the current SG element with PageHighMem(sg_page(&sg[cur])) and
terminate the trace statement. Preserve the optional branch and its
existing no-clustering behavior; normal builds do not define
SCST_HIGHMEM.
Cppcheck reports nullPointerRedundantCheck in scst_pr_send_ua_all(): Either the condition 'reg!=exclude_reg' is redundant or there is possible null pointer dereference: reg. The list is protected by dev_pr_mutex and contains valid registrants. exclude_reg may deliberately be NULL to address every registrant. State that case explicitly before comparing the current entry. Preserve the existing behavior for a well-formed list and a non-NULL exclusion, without treating NULL as a list entry or adding a suppression.
Cppcheck reports invalidPrintfArgType_sint in the DEBUG_TM_IGNORE branch of usr/fileio/common.c: %d in format string (no. 2) requires 'int' but the argument type is 'unsigned int'. cmd_h is a uint32_t ABI field. Use %u, as in the other command-handle traces, so handles above INT_MAX are not printed as negative values.
Cppcheck reports constParameterPointer for cmd in scst_set_io_context() and scst_unmap_overlap(), dev in tm_dbg_task_mgmt() and scst_cm_dev_free_designators(), tgt_dev in __scst_abort_task_set(), mcmd in scst_do_nexus_loss_sess(), test in percpu_test_start(), and map in sqa_free_cmd_map(). These helpers only read the supplied objects; mutations and frees through their members affect separate objects. Add const and propagate it through scst_cm_on_del_lun() and scst_lun_cm_del(), including their private declarations and KUnit stubs. The QLA cleanup helper forwards its allocation to kvfree(), which already accepts a const pointer. Resolve constParameterPointer in both iscsi_extracheck_is_*_thread() helpers and tm_dbg_deinit_tgt_dev(): Parameter 'conn' can be declared as pointer to const Parameter 'tgt_dev' can be declared as pointer to const Qualify enabled implementations, disabled stubs and private declarations together: they only inspect task/state or compare target-device identity. Resolve constVariablePointer for attrs_list in iscsi_del_attr(), pending_list in both pending-command cleanup loops, and head in dev_user_unjam_dev(): Variable 'attrs_list' can be declared as pointer to const Variable 'pending_list' can be declared as pointer to const Variable 'head' can be declared as pointer to const These local views only supply traversal sentinels. List nodes and owning objects remain mutable through their existing references and locks. Cppcheck reports constParameterCallback for iscsi_tcp_send_data_rsp() and isert_send_data_rsp(): Parameter 'sense' can be declared as pointer to const Both pass sense data to create_status_rsp(), which already accepts const. Qualify the internal transport slot and both implementations together. Keep exported SCST interfaces, kernel callback signatures and control ABI unchanged. Cppcheck also reports variableScope for tgt in scst_process_redirect_cmd(). Use cmd->tgt directly at its only use, before any callback can change cmd, instead of keeping an alias.
Checkpatch --strict reports LONG_LINE in deeply nested DIF action calls, conditional help strings and diagnostics containing PRI macros, and LONG_LINE_STRING in trace calls whose flags share the format line: CHECK:LONG_LINE: line length of 103 exceeds 100 columns CHECK:LONG_LINE_STRING: line length of 110 exceeds 100 columns Select the DIF action in a single setter argument instead of duplicating that setter in both branches. Preserve the mode test, PASS versus PASS_CHECK selection and update of the existing action flags. Wrap conditional alternatives, existing PRI concatenation boundaries and trace arguments without splitting diagnostic strings or changing argument order. Resolve 15 LONG_LINE and 23 LONG_LINE_STRING reports without adding exceptions. Retain layouts whose further shortening would require interface or deeper control-flow changes. Also fix PARENTHESIS_ALIGNMENT in dev_user_ext_cdb_get() and its private declaration, and remove an extra blank line. Quote and shorten the three HIGHMEM preprocessor warnings. This fixes Checkpatch CAMELCASE reports for <Consider> and <See> and the accompanying LINE_CONTINUATIONS reports without suppressing those diagnostic types. Preserve the existing conditions and the distinction between HIGHMEM being supported by the core and unsupported by the other two modules.
Checkpatch reports MACRO_ARG_REUSE in the private MD5 and SHA1 Boolean transforms and in MD5STEP, for example: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'z' - possible side-effects? CHECK:MACRO_ARG_REUSE: Macro argument reuse 'w' - possible side-effects? CHECK:MACRO_ARG_REUSE: Macro argument reuse 's' - possible side-effects? The current callers pass plain local state, so this is not a demonstrated digest bug. Replace the transforms with typed u32 inline functions and make each MD5 step return the updated word instead of mutating a macro argument. Pass the Boolean result by value, without a function pointer. Preserve all 64 MD5 round operands, constants, input indices and rotations, including truncation to 32 bits before rotation. Preserve the SHA1 round expressions and schedule. Resolve all seven native diagnostics without exceptions; leave compatibility and control-flow macros alone.
Checkpatch reports eight instances of: ERROR:ASSIGN_IN_IF: do not use assignment in if condition These occur in config_parse_main(), text_scan_login() and the get/set attribute event handlers. Each conditional stores the successful lookup index while falling back from target keys to session keys and user keys. Assign the index before each condition. Finish a handled configuration or login key with continue, and send successful attribute responses through the common done path. Only attempt the next lookup after the previous branch failed to match; do not eagerly evaluate every key table. Preserve target/global eligibility checks, unknown-key handling, parsing errors, response generation and buffer cleanup. This is a control-flow cleanup, not a fix for a demonstrated parameter lookup bug. Resolve all eight diagnostics without exceptions.
Checkpatch --strict reports CAMELCASE for the nine iSCSI parameter names passed to ISCSI_SESS_*_PARAM_ATTR(), including: CHECK:CAMELCASE: Avoid CamelCase: <InitialR2T> CHECK:CAMELCASE: Avoid CamelCase: <MaxRecvDataSegmentLength> CHECK:CAMELCASE: Avoid CamelCase: <HeaderDigest> These names form the existing sysfs interface and must retain their protocol spelling. Pass them as string literals and initialize the kobj_attribute directly instead of asking __ATTR() to stringify tokens. Keep every attribute name, mode 0444, show function and NULL store callback unchanged. Rename the macro parameter to param so it cannot substitute the .name designator in the initializer. Generated private symbols and session parameter accesses keep their existing spelling. This resolves the style reports without changing public structure fields or introducing aliases or diagnostic exceptions.
Cppcheck reports knownConditionTrueFalse at ten READ/WRITE CDB wrappers: Condition 'res!=0' is always false The shared helpers only extract LBA and length fields and have no failure path. Make the three helpers used solely for field extraction return void and remove the callers' impossible error branches. Keep the int result of get_cdb_info_lba_4_len_2 because it also implements the opcode-table callback. Keep READ/WRITE(6)'s zero-length-to-256 conversion, DIF action selection, corrupted-tag injection, and every return from the fallible protection parsers unchanged. Resolve all ten diagnostics without exceptions.
Cppcheck reports unreadVariable in dev_user_flush_dcache(): Variable 'start' is assigned a value that is never used. Only ARCH_HAS_FLUSH_ANON_PAGE needs the advancing virtual address. Move its increment into that branch, after the mapping lookup and anonymous page flush. Keep the initial zero-address check, data-cache flush, page iteration, and buffer-length accounting on every architecture.
lnocturno
force-pushed
the
3.11/gleb/analyzers
branch
5 times, most recently
from
October 23, 2026 15:55
16fac2a to
f63a47f
Compare
The shared path policy skips Clang, kernel regression, KUnit and Ginkgo when a pull request changes only inputs classified as unrelated to a check. Run these checks for every pull request to master so coverage no longer depends on maintaining that classification. Remove the selector, its TOML policy and dedicated tests, together with the workflow conditions and full-history checkouts used for selection. Keep VM supervisor checks and the kernel matrix dependency, and update the CI guide to describe unconditional PR coverage. Preserve the event-specific Ginkgo label sets and the 30-minute PR job limit. Push and manual triggers retain their existing behavior.
A source diff cannot establish that a module's unchanged consumers and headers remain clean. Make the analyzer targets always check their full configured scope. Retain explicit-file selection for focused investigation. Remove DIFFBR, --base and the shared Git diff/pathspec helpers. Keep policy validation, symlink checks and missing-input failures. Update CLI and selector fixtures and document the supported interface. Capture Git stderr and preserve it in source-selection errors, so SCS negative fixtures can assert the failure without leaking an expected "fatal: not a git repository" into a successful CI test log. The SCS layout rule and explicit-file interface remain unchanged.
Kbuild can discard a checker's exit status, and an interrupted checker can lose buffered output. Publish a started record before execution, stream native output to a retained log, then atomically publish the completed record. Require every announced CHECK to have a completed result before reporting clean analysis. Resolve relative CHECK paths against active make directories before falling back to suffixes. This avoids confusing duplicate basenames such as config.c while keeping ambiguous or missing invocations fatal. Allow capture clients to clear checker-only CHECKFLAGS explicitly. Give the shared process-group runner bounded deadlines and preserve partial output on timeout or interruption. Add a result renderer that separates active diagnostics, notes, reviewed exceptions, coverage and build messages. A pahole version notice is evidence, not a checker failure. Native records remain authoritative for exit status. Cover interrupted adapters, duplicate and missing CHECK invocations, process-group termination, output retention and report classification with isolated fixtures. Sparse and Smatch exception policy is unchanged. Serialize report replacement with a per-tool lock, separate from the Kbuild lock. Validate inherited lock descriptors and preserve Make jobserver descriptors. Keep the lock until rendering and publication finish, so another invocation cannot replace the evidence underneath it. Allow outer callers to extend cancellation grace while native process groups retain their two-second deadline. Render native exit statuses, checker activity, source findings, coverage limitations and build diagnostics separately. Group repeated inventories without changing the retained logs. Label progress as total elapsed time; per-rule durations remain distinct. Cover locks, inherited descriptors, termination escalation and report rendering with isolated fixtures.
Provide make compile-commands as a shared compilation database for tools and editors. Read actual Kbuild compiler commands from .cmd files and check them against fresh capture records, rather than passing Sparse-specific CHECKFLAGS to a C compiler. Record userspace recipes through the same compile_c expansion used for normal objects, without rebuilding executables. Keep the collector out of ordinary CLI prerequisites so builds need no Python tooling. Retain original commands and build evidence, require complete capture, and publish the database atomically under the shared build lock. The export includes configured sources outside analyzer policy; consumers apply their own scope. Add isolated collector and Make recipe fixtures. Target analysis at the current CI kernel instead of supporting legacy Kbuild layouts. Reject CHECK records whose cwd is the kernel build tree before reading its unrelated modules.order. Keep module-build support independent of this analyzer requirement and cover the rejection with an isolated inventory fixture.
The analyzer workflow checks source style independently of kernel compatibility builds. Stop running each downloaded kernel's Checkpatch on the generated SCST patch, and remove its separate diagnostic summary and filters. Patch generation, application and compilation stay intact. Remove the obsolete -nc option from the regression runner, kernel matrix parser, regression workflow and nightly entries. Preserve every kernel version and all remaining build options. Update the regression workflow documentation and kernel-update instructions in the same patch.
Whole-file Checkpatch needs reviewed exceptions without hiding native failures. Validate per-file completion, totals, stderr and exit status before applying source comments. An unreadable second file must fail even if all findings from the first file are exempt. Support exact rule IDs, bounded regions, macros, named identifiers and single-rule file scopes with reasons. Allow standalone comments to wrap without expanding their scope. Bind PREFER_FALLTHROUGH and TYPO_SPELLING to comments; retain neighboring locations and other diagnostic types. Limit COMPLEX_MACRO ranges to single-line object-like sense tuples with known keys and byte-valued ASC/ASCQ. Reject expressions, function-like macros, directives, unrelated code and literals instead of broadening the exception. Keep ordinary macro exceptions attached to one definition. Add completion, location-binding and malformed-declaration fixtures, including block boundaries and attempted sense-structure bypasses. Recognize CONSTANT_COMPARISON only in complete #if/#elif predicates comparing the configured version macros and literal constructors. Parse Boolean groups, defined guards, vendor - 0 and paired >> 8 forms. Splice physical lines before recognizing comments and literals. Mixed or unknown expressions and ordinary C comparisons remain checked. Recognize LONG_LINE_STRING only for the exact configured logging names and paths when a literal format argument ends the line. Keep checks on other arguments, unrelated calls and ordinary strings. Validate native source quotations before either exception and retain all raw findings. Add structural, continuation, false-match and malformed-policy fixtures. Remove the legacy Checkpatch wrappers and their separate PR workflow. Make checkpatch and the analyzer workflow provide the source checks; Conform and review own commit-message conventions. Accept native totals without the checks field when strict mode is disabled; Checkpatch omits that field rather than emitting zero. Preserve severity accounting and per-file completion checks. Add native clean, WARNING and CHECK probes in both modes, including the strict-only AVOID_BUG severity in --file mode. Require an unreadable second input to remain incomplete in every case. Keep the global exclusions in the same policy change: AVOID_BUG for established invariant assertions, LINUX_VERSION_CODE for supported upstream/vendor compatibility, and commit-submission metadata checks which do not apply to source analysis. Do not disable other source rules. Use the shared report lock around analysis and evidence publication.
Use the structurally validated policy for version predicates and complete logging literals. Keep ordinary C comparisons and other long strings checked instead of disabling CONSTANT_COMPARISON or LONG_LINE_STRING. Attach the remaining exceptions to their source constructs: - CONST_STRUCT for registration objects required by older kernels, and CONSTANT_COMPARISON for one SRP enum constant-expression maximum. - COMPLEX_MACRO, MACRO_ARG_REUSE, MACRO_ARG_PRECEDENCE and related rules for reviewed tuples, declarations and token builders. - IF_0, IF_1 and MSLEEP for retained debug paths and existing timing. - PREFER_KERNEL_TYPES and SPDX_LICENSE_TAG for portable ABI types and existing license headers, with one diagnostic per file exemption. - LONG_LINE for symbolic sense arguments, long API and DIF action names. - STRLCPY, portable fallthrough and established interface spellings at their specific call sites. Declare each shared CamelCase symbol once. Group 51 sense definitions into two bounded COMPLEX_MACRO ranges and 23 protocol bit constants into five BIT_MACRO ranges. Keep one shared reason per group. Sense blocks are structurally validated; the remaining macro and line exceptions stay individually scoped. The full native scan reports 421 CONSTANT_COMPARISON, 259 LONG_LINE_STRING and 42 LONG_LINE findings. All remain in raw reports with their reviewed reasons; execution failures and incomplete reports cannot be exempted. Source changes in this patch are comments only; assertions, debug paths and compatibility behavior are unchanged.
Extend installed parser hints with current SCST declaration and iterator bodies. Read complete definitions directly from source instead of pinning their hashes. Reject missing or ambiguous definitions. Do not generate synthetic macro contexts or claim exhaustive macro/_Generic coverage. Recognize native parse errors only when the excerpt matches a complete current standalone macro definition in source scope. Preserve them as explicit coverage limitations with the original excerpt and policy reason. Call-site errors, partial definitions, lost surrounding bodies, missing handling records and unfinished rules remain blocking. Ignore alignment annotations and supply for_each_possible_cpu parser hints without removing project bodies. Adapt stream_open.cocci using exact structural anchors, and the known add_namespace.cocci version using its content hash, in private report-mode copies. Validate effective spatch options and retain native handling/completion records. Support source-bound rule exceptions with adjacent reasons. List rules without report mode as skipped and the exact reviewed do_div Python SyntaxWarning as visible advice. Source exceptions cannot waive parser, coverage or execution failures. Add source-reader, model, frontend, rule-adaptation and coverage fixtures alongside the integration. Record each rule duration and publish the current rule in a run-bound progress record for the shared frontend. Keep progress separate from native diagnostics and handling/completion evidence. Add native positive and negative semantic-match probes for current sysfs and KUnit declaration models, visibility annotations and CPU iteration. Require TRACE_EXIT to remain distinct from return. Exercise the actual kernel stream_open and namespace adaptations, checking completion and unchanged inputs rather than accepting missing findings alone. Cover several initializer fields, nested commas, empty tails and GNU named variadics with native probes. Fedora's Coccinelle 1.3.1 loses the scst_kunit_suite initializer fields and fails the probe with: AssertionError: 0 != 1 Temporarily skip the four variadic probes with an explicit reason while awaiting an upstream fix. Keep their assertions for re-enabling and retain the other native model probes. Do not alter SCST sources or patch the distribution analyzer.
The native report rules flag atomic_as_refcounter for completion counters, double_lock/mini_lock for caller-owned lock phases, and use_after_iter for guarded break results and RCU iterator output parameters. Document these contracts beside the affected statements instead of filtering matching text from arbitrary diagnostics. Retain ptr_err_to_pe, string_choices, ifnullfree and minmax exceptions where replacements require newer kernel helpers or lose a constant array bound. Carry forward reviewed SCST contracts with exact rule IDs and bounded locations. There are no file-wide Coccinelle exceptions and no parser or execution-error suppressions.
lnocturno
force-pushed
the
3.11/gleb/analyzers
branch
from
October 23, 2026 19:20
f63a47f to
b007740
Compare
Use the shared compilation database for separate kernel and userspace profiles. Preserve original commands, compiler ABI/features and build configuration; do not invent unrelated --force configurations. Give parallel scans fresh per-profile build directories so whole-program checks remain enabled and stale state cannot affect later runs. Keep project bodies and headers, replacing kernel header bodies with reviewed SCST syntax and ownership contracts. Preserve volatile READ_ONCE/WRITE_ONCE accesses, vendor version predicates, CPU-mask iteration and native byte order. Userspace probes retain the real Linux UAPI and libc endian macros. Keep explicit in-tree settings and prevent unrelated kernel branches in CLI commands. Validate native inline suppression IDs against cppcheck --errorlist. Expose exact unmatchedSuppression notices and reviewed omitted system headers as advice only after frontend and checker coverage validation. Keep QLogic dependency-header findings outside owned diagnostic scope; errors also referencing the SCST target and all frontend failures block. Allow consecutive native exception annotations for one construct to share a preceding rationale comment. Stop at code, preprocessor boundaries, file scopes, block ends and another annotation's inline reason. Preserve each diagnostic ID, symbol and source range. Document the common-rationale syntax and cover grouped signatures, separate contracts and inheritance boundaries with isolated parser fixtures. Retain probe commands, partial output, raw XML, original/adapted commands and complete header inventories. Unknown includes, unknown IDs and incomplete analysis remain failures. Add isolated compiler, byte-order, header, native-exception and parallel-profile fixtures. Explain the native "Active checkers: 120/189" inventory for Cppcheck 2.22.0. Of its 69 No entries, 67 require C++, one requires Windows, and unusedFunction uses a build-directory whole-program path which omits logChecker. Keep these explanations bound to the audited version; unknown reasons remain explicit. Preserve native activity flags and requirements without relaxing failure checks or suppressing diagnostics. Add native model probes using the same kernel.h, kernel.cfg and compiler context as analysis. Valid allocation/free, member access, iterator and trace examples must pass; deliberate bugs must retain leakReturnValNotUsed, memleak, deallocret and arrayIndexOutOfBounds. Keep these analyzer fixtures separate from tests of SCST kernel behavior. Keep the trace fixture's only invalid array access inside TP_fast_assign; TP_printk must not produce the expected arrayIndexOutOfBounds instead. Require its location to reference the tested macro invocation. On fixture failure, emit compiler probe commands and complete logs before deleting the temporary directory, so CI retains the cause of preparation failures. Add isolated fixtures for diagnostic locations and failed compiler probes.
Use native source declarations and local reasons for retained contracts: - constParameterCallback/constParameterPointer for mutable callback or exported interfaces, disabled stubs and list-destruction contracts. Debug paths can set cmd->atomic, lock the connection and release commands from the device hash. The TCP receive callback mutates its command; QLogic target callbacks retain the upstream mutable session signature. - constVariablePointer for the optional per-device command counter and older RDMA interfaces requiring a mutable device. - knownConditionTrueFalse and unsignedLessThanZero for compile-time assertions, configuration-dependent predicates and execution invariants; redundantContinue for the shared loop-tail label. - memleak for release_work and w, whose ownership transfers to workers. Keep the release_work exception on the queued-work path only; failed allocation leaves no object to transfer or leak. - selfAssignment for endian conversions that swap on big-endian hosts. - unassignedVariable for the GNU local label in ___scst_wait_event. - unusedFunction for public inline APIs, helpers called by the separately analyzed daemon or excluded QLogic sources, and the retained disabled scst_zero_write_rest() debug caller. - unreachableCode for deliberate HIGHMEM initialization guards. - duplicateBreak for the explicit copy-manager debug-loop exit after sBUG(). Keep the break so the loop remains safe if the fatal assertion is removed or the diagnostic code is reused. Bind ownership exceptions to the affected variable and signature-only blocks to the parameter declaration. Keep 251 declarations with no file-wide exceptions or frontend/coverage suppressions. Unmatched declarations remain visible as validated advice, not suppression hits. Use one shared rationale for adjacent annotations of the same callback signature. Avoid repeating identical explanations for different warning IDs or parameters; retain all 251 declarations and their exact scopes. Document the declaration syntax and policy/model ownership. These source changes are comments only; callback ABI and runtime behavior are unchanged.
Route the analyzer targets, including SCS and all-lint, through one frontend with Start, Run, Result and Reports sections. Preserve complete driver output beside the native JSON and readable summary. Show grouped findings, coverage, inventories and PASS/FAIL/SKIP; fold details in GitHub Actions and expose command tracing with V=1. Identify each invocation and reject stale, malformed or inconsistent reports. Hold the shared report lock through driver execution and rendering, passing its validated descriptor to the child while preserving Make's jobserver. Give the driver ten seconds to stop its native process group and publish partial evidence before escalation. Include SCS diagnostics, parser runtime and run identity in its report. Keep the native classification authoritative and preserve nonzero Make status when a tool or analysis fails. Add isolated frontend fixtures for invalid results, interruptions, report ownership and rendering failures.
Add make analyzer-tests for tracked script fixtures and native Checkpatch, Coccinelle and Cppcheck model probes. Run each suite in an isolated process with one interpreter, bounded execution and retained logs and JSON results. Missing tools, empty suites, unexpected skips, expected failures and interrupted children fail the target. These probes do not build or execute SCST. Keep make lint-test for lightweight wrapper fixtures and the separate SCS parser tests. The native probes exercise the production models: valid C examples must pass and deliberate bugs must retain the expected analyzer diagnostic rather than disappearing during model expansion. Allow only the four named Coccinelle variadic probes deferred for the upstream argument-expansion defect. Check their exact suite, test and reason in both child and parent, retain visible SKIP records, and reject duplicate or missing details and suites without an executed test. All other skips and failures remain blocking. Add isolated runner fixtures for result consistency, environment isolation, cancellation, and failures beside an approved skip.
Run the parallel analyzer matrix, native tooling/model probes and SCST style checks on PRs to master, pushes to master and manual dispatch. Cancel obsolete runs of the same PR without cancelling post-merge runs. Keep PR and manual jobs strict. Push jobs allow workflow-level failure while preserving failed steps and the native strict exit status. Use the common Make frontend and require complete reports, matching invocation identities and KUnit coverage before publishing findings or summaries. Hold the inherited report lock through final CI validation. Allow twenty seconds for Make and its children to stop and retain partial reports before escalation. A later Make failure must not publish a clean native result. Include SCS evidence in summaries and retained artifacts. Run make analyzer-tests in the analyzer container alongside analysis. Keep Fedora's packaged Coccinelle without a local patch or version pin; the runner reports the four explicitly deferred upstream variadic probes. Distribution tools follow Fedora updates, while kernel inputs and Sparse/Smatch revisions remain pinned and recorded in tool provenance. Split Smatch's data and manual-page install pattern rules to address: warning: pattern recipe did not update peer target Each recipe installs one target, so the targets must be independent. Record this install patch alongside the frontend fix in provenance. Add isolated CI fixtures for status, coverage and publication consistency.
lnocturno
force-pushed
the
3.11/gleb/analyzers
branch
from
October 26, 2026 08:45
b007740 to
f2d950a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.