summaryrefslogtreecommitdiffstats
path: root/coccinelle (follow)
Commit message (Collapse)AuthorAgeFilesLines
* coccinelle: add a rule for in_addr_hash_func()Frantisek Sumsal2024-01-021-0/+7
| | | | Follow-up for c01a5c0.
* coccinelle: drop a couple of FIXMEsFrantisek Sumsal2024-01-022-7/+10
| | | | | | | | | | | | | | | | | | Turns out Coccinelle can handle compound literals just fine, the parsing errors were caused by incorrectly parsed macros in code before the literals, so let's just provide simplified versions for such macros. The parsing error in `Type *foo[ELEMENTSOF(bar)] = {};` is actually harmless; it occurs only when creating an array of pointers for a type that's in an external header and it occurs only on the first parser's pass, subsequent passes resolve the type correctly. Also, unset ENABLE_DEBUG_HASHMAP, so Coccinelle doesn't expand the hashmap debug macros. As for the remaining FIXMEs, I opened a couple of issues in the Coccinelle upstream to see if they can be fixed there (or at least properly analyzed).
* coccinelle: re-indent commentsYu Watanabe2023-12-281-4/+4
|
* coccinelle: fix typoYu Watanabe2023-12-281-1/+1
| | | | Follow-up for b25d3b36a21cd7a68039b85f887cc849ff7664a1.
* Merge pull request #30639 from mrc0mmand/more-cocci-shenanigansYu Watanabe2023-12-273-248/+90
|\ | | | | Another batch of Coccinelle tweaks
| * coccinelle: dial back warnings about performanceFrantisek Sumsal2023-12-271-8/+2
| | | | | | | | | | | | | | | | Turns out I _really_ underestimated the impact of --include-headers-for-types, as it significantly reduces both runtime and storage penalties. For example, on my machine the runtime of uncached run goes down from ~15 minutes to ~2 minutes, and similarly the total storage needed by the cache goes from ~15 GiB down to ~3 GiB.
| * coccinelle: help Coccinelle with some more complex macrosFrantisek Sumsal2023-12-273-238/+81
| | | | | | | | | | | | | | | | | | | | Drop the original macro file, since it's not needed anymore thanks to resolving includes properly, but introduce a similar file - parsing_hacks.h - that helps Coccinelle in some specific corner cases. This eliminates most of the outstanding parsing errors in source files. The remaining ones are limitations of the parsing engine (see the FIXMEs in pasing_hacks.h) and need further investigation.
| * coccinelle: search the system include path for header files as wellFrantisek Sumsal2023-12-271-1/+4
| | | | | | | | | | | | | | Since Coccinelle is originally a kernel tool, it doesn't search the system include path by default for header files. Without this we're missing a lot of types provides by stdlib (and other libraries we make use of).
| * coccinelle: explicitly undefine SD_BOOTFrantisek Sumsal2023-12-261-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | So Coccinelle doesn't pull in includes guarded by #if SD_BOOT. For example: $ head -n5 main.c #if FOO #include "foo.h" #else #include "bar.h" #endif $ spatch --verbose-includes --recursive-includes --sp-file zz-drop-braces.cocci main.c init_defs_builtins: /usr/lib64/coccinelle/standard.h HANDLING: main.c including ./foo.h including ./bar.h $ spatch --verbose-includes --recursive-includes --sp-file zz-drop-braces.cocci main.c --undefined FOO init_defs_builtins: /usr/lib64/coccinelle/standard.h HANDLING: main.c including ./bar.h
* | coccinelle: fix typoYu Watanabe2023-12-261-2/+2
|/
* Merge pull request #30633 from mrc0mmand/cocci-shenanigansYu Watanabe2023-12-253-26/+53
|\ | | | | coccinelle: rework how we run the Coccinelle transformations
| * coccinelle: properly drop braces around single-statement if()sFrantisek Sumsal2023-12-251-20/+5
| |
| * coccinelle: fix the log-json ruleFrantisek Sumsal2023-12-251-2/+1
| | | | | | | | As it generated very questionable results.
| * coccinelle: rework how we run the Coccinelle transformationsFrantisek Sumsal2023-12-251-4/+47
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Turns out that the original way we did things was quite broken, as it skipped a _lot_ of code. This was because we just threw everything into one pile and tried to spatch it, but this made Coccinelle sad, like when man page examples redefined some of our macros, causing typedef conflicts. For example, with a minimal reproducer that defines a cleanup macro in two source files, Coccinelle has no issues when spatch-ing each one separately: $ spatch --verbose-parsing --sp-file zz-drop-braces.cocci main.c init_defs_builtins: /usr/lib64/coccinelle/standard.h HANDLING: main.c SPECIAL NAMES: adding _cleanup_ as a attribute with arguments SPECIAL NAMES: adding _cleanup_free_ as a attribute $ spatch --verbose-parsing --sp-file zz-drop-braces.cocci logcontrol-example.c init_defs_builtins: /usr/lib64/coccinelle/standard.h HANDLING: logcontrol-example.c SPECIAL NAMES: adding _cleanup_ as a attribute with arguments But when you try to spatch both of them at once, Coccinelle starts complaining and skipping the "bad" code: $ spatch --verbose-parsing --sp-file zz-drop-braces.cocci main.c logcontrol-example.c init_defs_builtins: /usr/lib64/coccinelle/standard.h HANDLING: main.c logcontrol-example.c SPECIAL NAMES: adding _cleanup_ as a attribute with arguments SPECIAL NAMES: adding _cleanup_free_ as a attribute remapping: _cleanup_ to an ident in macro name ERROR-RECOV: found sync end of #define, line 44 parsing pass2: try again ERROR-RECOV: found sync end of #define, line 44 parse error = File "logcontrol-example.c", line 44, column 21, charpos = 1719 around = '__attribute__', whole content = #define _cleanup_(f) __attribute__((cleanup(f))) badcount: 2 bad: #include <systemd/sd-journal.h> bad: BAD:!!!!! #define _cleanup_(f) __attribute__((cleanup(f))) This was, unfortunately, hidden as it is visible only with --verbose-parsing (or --parse-error-msg). Another issue was how we handled includes. The original way of throwing them into the pile of source files doesn't really work, leading up to similar issues as above. The better way is to let Coccinelle properly resolve all includes by telling it where to find our own include files (basically the same thing we already do during compilation). After fixing all this, Coccinelle now has a chance to process much more of our code (there are still some issues in more complex macros, but that requires further investigation). However, there's a huge downside from all of this - doing a _proper_ code analysis is surprisingly time and resource heavy; meaning that processing just one Coccinelle rule now takes 15 - 30 minutes. To make this slightly less painful, Coccinelle supports caching the generated ASTs, which actually helps a lot - it gets the runtime of one rule from 15 - 30 minutes down to ~1 minute. It, of course, has its own downside - the cache is _really_ big (ATTOW the cache takes ~15 GiB). However, even with the aggressive AST caching you're still looking at ~1 hour for one full Coccinelle run, which is a bit annoying, but I guess that's the price of doing things _properly_ (but I'll definitely look into ways of further optimizing this).
* | format-table: introduce table_isempty and use it where appropriateMike Yuan2023-12-251-0/+10
| |
* | siphash24: introduce siphash24_compress_typesafe() macroYu Watanabe2023-12-251-0/+6
| | | | | | | | | | | | | | | | To prevent copy-and-paste mistake. This also introduce in_addr_hash_func(). No functional change, just refactoring.
* | coccinelle: convert hashmap_size() == 0 or friendsYu Watanabe2023-12-241-0/+91
|/ | | | Addresses https://github.com/systemd/systemd/pull/30567#issuecomment-1866631816.
* coccinelle: don't run iovec-make on iovec_done{,_erase}Frantisek Sumsal2023-10-251-1/+5
| | | | | | | | | | | | As the result is a bit funky (but still valid), i.e.: static inline void iovec_done_erase(struct iovec *iovec) { assert(iovec); - iovec->iov_base = erase_and_free(iovec->iov_base); - iovec->iov_len = 0; + *iovec = IOVEC_MAKE(erase_and_free(iovec->iov_base), 0); }
* tree-wide: use cocinnelle to apply _NEG_ macrosZbigniew Jędrzejewski-Szmek2023-08-161-0/+46
|
* coccinelle/take-fd: match for -EBADF instead of -1Mike Yuan2023-07-091-2/+2
| | | | Follow-up for 254d1313ae5a69c08c9b93032aaaf3d6083cfc07
* coccinelle: add a transformation for GNU conditionalsFrantisek Sumsal2023-03-181-0/+7
| | | | i.e. x ? x : y => x ?: y
* coccinelle: respect spacing from the semantic patchFrantisek Sumsal2023-03-181-1/+1
|
* coccinelle: skip the empty-to-null transformation on the macro itselfFrantisek Sumsal2023-01-251-2/+6
| | | | | | | | Since the empty_to_null() function was "macrofied", we need to use a bit of black magic to make Coccinelle avoid running the transformation on the macro itself. Follow-up to ef2409cbde3.
* tree-wide: use -EBADF for fd initializationZbigniew Jędrzejewski-Szmek2022-12-191-3/+3
| | | | | | | | | | | | | | | | -1 was used everywhere, but -EBADF or -EBADFD started being used in various places. Let's make things consistent in the new style. Note that there are two candidates: EBADF 9 Bad file descriptor EBADFD 77 File descriptor in bad state Since we're initializating the fd, we're just assigning a value that means "no fd yet", so it's just a bad file descriptor, and the first errno fits better. If instead we had a valid file descriptor that became invalid because of some operation or state change, the other errno would fit better. In some places, initialization is dropped if unnecessary.
* treewide: drop "RUN_" from "RUN_WITH_UMASK"Zbigniew Jędrzejewski-Szmek2022-12-131-1/+1
| | | | | | RUN_WITH_UMASK was initially conceived for spawning externals progs with the umask set. But nowadays we use it various syscalls and stuff that doesn't "run" anything, so the "RUN_" prefix has outlived its usefulness.
* basic/list: drop LIST_IS_EMPTYZbigniew Jędrzejewski-Szmek2022-07-021-2/+0
| | | | | | | | | | This was a trivial wrapper that didn't provide any added value. With more complicated structures like strvs, hashmaps, sets, and arrays, it is possible to have an empty container. But in case of a list, the list is empty only when the head is missing. Also, we generally want the positive condition, so we replace many if (!LIST_IS_EMPTY(x)) with just if (x).
* coccinelle: don't try to use IN_SET() in assert_cc()Frantisek Sumsal2022-05-301-5/+17
| | | | Since assert_cc() requires an integral constant expression.
* coccinelle: automatically look for timestamp_is_set candidatesLennart Poettering2022-02-221-0/+73
| | | | | | Based on @mrc0mmand's Coccinelle skills, not mine. All credit is his. Co-authored-by: Frantisek Sumsal <frantisek@sumsal.cz>
* coccinelle: automatically switch some uses of memcpy() → mempcpy()Lennart Poettering2022-02-161-0/+13
| | | | | Inspired by #22520, let's add a coccinelle script that converts this automatically.
* list: drop unnecessary line continuationYu Watanabe2021-12-241-1/+1
| | | | Fixes #21886.
* Change all fixed-path bash shebangs to /u/b/env bash outside test/наб2021-12-121-1/+2
|
* alloc-util: add strdupa_safe() + strndupa_safe() and use it everywhereLennart Poettering2021-10-141-0/+11
| | | | | | | | | | | | | Let's define two helpers strdupa_safe() + strndupa_safe() which do the same as their non-safe counterparts, except that they abort if called with allocations larger than ALLOCA_MAX. This should ensure that all our alloca() based allocations are subject to this limit. afaics glibc offers three alloca() based APIs: alloca() itself, strndupa() + strdupa(). With this we have now replacements for all of them, that take the limit into account.
* licensing: add spdx to our .cocci filesZbigniew Jędrzejewski-Szmek2021-10-0152-1/+54
| | | | | Since those are chunks of code based on our codebase, it's easiest to use the same license.
* ci: use LGPLv2+ for all our ci configurationZbigniew Jędrzejewski-Szmek2021-10-011-0/+1
|
* ci: shellcheck-ify CI scriptsFrantisek Sumsal2021-09-291-11/+14
|
* coccinelle: filter out a couple of 'false-positive' transformationsFrantisek Sumsal2021-03-183-2/+5
| | | | | | | | | | * flag-set.cocci: perform the transformation only if the second argument is a constant * sd-journal/lookup3.c: skip the cocci completely for this file, since it's not "ours" * strjoina.cocci: skip the transformation on the "test_strjoina" test, since it intentionally tests the "incorrect" expression we're trying to transform (the same thing was already done in strjoin.cocci)
* coccinelle: ignore specific cases to use SYNTHETIC_ERRNO() macroYu Watanabe2020-11-271-0/+6
|
* coccinelle: add rules for log_unit_error_errno() or friendsYu Watanabe2020-11-272-0/+269
|
* coccinelle: always use SYNTHETIC_ERRNO() macroYu Watanabe2020-11-191-2/+2
|
* coccinelle: add one more rule to use return value of log_xxx_errno()Yu Watanabe2020-11-191-0/+9
|
* coccinelle: introduce drop-braces transformationFrantisek Sumsal2020-10-091-0/+27
| | | | | | to drop braces around single-line if statements. Also, prefix it with zz- so it runs as the last one, so it's able to fix stuff tweaked by previous transformations.
* coccinelle: check for invalid errno comparisonsFrantisek Sumsal2020-10-091-0/+10
| | | | Prompted by #15868
* coccinelle: correctly resolve our own macrosFrantisek Sumsal2020-10-092-2/+233
| | | | | | | | Coccinelle can't do this automagically and requires we supply it respective header files. Unfortunately, the option for this (--macro-file=) can be used only once, so let's create our own macro file by collecting macros needed for the semantic parser to be happy.
* coccinelle: skip strjoin transformation in test_strjoin()Frantisek Sumsal2020-10-041-10/+9
|
* coccinelle: limit the # of expressions in in_set/not_in_setFrantisek Sumsal2020-10-042-27/+4
| | | | | | transformations. Otherwise the time and resources to generate all possible permutations is simply unreasonable for running on local machines.
* coccinelle: skip the xsprintf transformation on man pagesFrantisek Sumsal2020-10-041-1/+2
| | | | since we don't expose xsprintf to users.
* coccinelle: disable flags-set where it doesn't make senseFrantisek Sumsal2020-10-041-3/+9
|
* coccinelle: fix the equals-null transformationFrantisek Sumsal2020-10-041-6/+21
| | | | | | | | | | The original issue with this transformation was that we were replacing the whole if statement instead of just the expression inside. That caused the code to be weirdly formatted, as Coccinelle put a new block around each replaced if statement. This version replaces just the inner expression if it's in its incorrect form, otherwise it just accepts it (to avoid recursion).
* coccinelle: drop the custom isomorphismsFrantisek Sumsal2020-10-042-22/+1
| | | | | | | | My former dumb me didn't read the documentation properly, so with the introduction of custom isomorphisms I caused two issues: 1) Masked all standard isomorphisms defined by Coccinelle 2) Replace the original issue with a completely new one
* execute: use empty_to_root() a bit moreLennart Poettering2020-10-011-0/+5
|