Re: [RFC] Clang plugin for catching suspicious typedef casting - Mailing list pgsql-hackers
From | Dmitry Dolgov |
---|---|
Subject | Re: [RFC] Clang plugin for catching suspicious typedef casting |
Date | |
Msg-id | 20231206150722.ilqr5553tdhpfccz@ddolgov.remote.csb Whole thread Raw |
In response to | Re: [RFC] Clang plugin for catching suspicious typedef casting (Peter Geoghegan <pg@bowt.ie>) |
List | pgsql-hackers |
> On Sun, Dec 03, 2023 at 07:02:55PM -0800, Peter Geoghegan wrote: > On Sun, Dec 3, 2023 at 6:31 AM Dmitry Dolgov <9erthalion6@gmail.com> wrote: > > > Only advantage I see to using libclang is that you can run programs built > > > with libclang regardless of what your C compiler is. I typically use GCC. > > > > > > I think your idea of automating this kind of thing is great no matter how it > > > is implemented. > > > > Yeah, absolutely. > > What is the difference between a clang plugin (or whatever this is), > and a custom clang-tidy check? Are they the same thing? Good question. Obviously one difference is that a clang plugin is more tightly integrated into the build process, where a custom clang-tidy check could be used independently. IIUC they also use different API, AST Consumer vs AST Matchers, but so far I have no idea what consequences does it have. Clang tooling page has this to say about choosing the right interface [1], where clang-tidy seems to fall into LibTooling cathegory: Clang Plugins allow you to run additional actions on the AST as part of a compilation. Plugins are dynamic libraries that are loaded at runtime by the compiler, and they’re easy to integrate into your build environment. Canonical examples of when to use Clang Plugins: * special lint-style warnings or errors for your project creating * additional build artifacts from a single compile step [...] LibTooling is a C++ interface aimed at writing standalone tools, as well as integrating into services that run clang tools. Canonical examples of when to use LibTooling: * a simple syntax checker * refactoring tools > I myself use clang-tidy through clangd. It has a huge number of > checks, plus some custom checks that are only used by certain open > source projects. > > An example of a check that seems like it would be interesting to > Postgres hackers: > > https://releases.llvm.org/17.0.1/tools/clang/tools/extra/docs/clang-tidy/checks/bugprone/signal-handler.html > > An example of a custom clang-tidy check, used for the Linux Kernel: > > https://releases.llvm.org/17.0.1/tools/clang/tools/extra/docs/clang-tidy/checks/linuxkernel/must-use-errs.html Yeah, those look interesting, and might be even worth including independently of the topic in this thread. > Your idea of starting with a check that identifies when BlockNumber > and Buffer variables were confused seems like the right general idea > to me. It's just about impossible for this to be a false positive in practice, > which is important. But, I wonder, is there a way of accomplishing the > same thing without any custom code? Seems like the general idea of not > confusing two types like BlockNumber and Buffer might be a generic > one? Agree, the example in this patch could be generalized. > * A custom check that enforces coding standards within signal handlers > -- the generic one that I linked to might need to be customized, in > whatever way (don't use it myself). > > * A custom check that enforces a coding standard that applies within > critical sections. > > We already have an assertion that catches memory allocations made > within a critical section. It might make sense to have tooling that > can detect other kinds of definitely-unsafe things in critical > sections. For example, maybe it would be possible to detect when > XLogRegisterBufData() has been passed a pointer to something on the > stack that will go out of scope, in a way that leaves open the > possibility of reading random stuff from the stack once inside > XLogInsert(). AddressSanitizer's use-after-scope can detect that sort > of thing, though not reliably. Interesting ideas, thanks for sharing. I'm going to try implementing some of those. [1]: https://clang.llvm.org/docs/Tooling.html
pgsql-hackers by date: