Szelethus accepted this revision.
Szelethus marked 2 inline comments as done.
Szelethus added a comment.

LGTM! Mind that I just published D76917 <https://reviews.llvm.org/D76917>, you 
can, if you prefer, rebase on top of that. Also, a test case for `delete`ing a 
`ZERO_SIZE_PTR` valued pointer might be nice :)

If you prefer, feel free to commit without another round of reviews.



================
Comment at: clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp:396
+  /// yes was the value obtained or not.
+  mutable Optional<Optional<int>> KernelZeroSizePtrValue;
+
----------------
balazske wrote:
> martong wrote:
> > balazske wrote:
> > > martong wrote:
> > > > Which one is referred to the lazy initialization? The inner or the 
> > > > outer?
> > > > These questions actually made me to come up with a more explanatory 
> > > > construct here:
> > > > Could we do something like this?
> > > > ```
> > > > using LazyInitialized = Optional<int>;
> > > > mutable Optional<LazyInitialized> KernelZeroSizePtrValue; // Or 
> > > > Lazy<Optional<...>>
> > > > ```
> > > Probably use a `std::unique_ptr<Optional<int>>` instead (like at the bug 
> > > types, they could be optional too)?
> > > If there is a code like
> > > ```
> > > bool IsSomethingInitialized;
> > > int Something;
> > > ```
> > > that looks as a clear case to use an optional (or unique_ptr)? And if 
> > > yes, is a reason for not using this construct if `int` is replaced by 
> > > `Optional<int>`?
> > Now I see that the lazy initialization is represented by the outer optional.
> > So IMHO a using template could be the best to describe cleanly this 
> > construct:
> > ```
> > template <class T>
> > using LazyInitialized = Optional<T>;
> > mutable LazyInitialized<Optional<int>> KernelZeroSizePtrValue;
> > ```
> > 
> With this I would wait for opinion of somebody else.
What @martong is saying is indeed nice, but the comments explain whats 
happening as well -- I'll leave it up to you how you want to commit this.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp:1687
+  if (ArgValKnown) {
+    if (!KernelZeroSizePtrValue)
+      KernelZeroSizePtrValue =
----------------
balazske wrote:
> Szelethus wrote:
> > balazske wrote:
> > > Szelethus wrote:
> > > > Szelethus wrote:
> > > > > martong wrote:
> > > > > > balazske wrote:
> > > > > > > martong wrote:
> > > > > > > > martong wrote:
> > > > > > > > > This is a bit confusing for me. Perhaps alternatively we 
> > > > > > > > > could have a free function `isInitialized(KernelZero...)` 
> > > > > > > > > instead. Or maybe having a separate bool variable to indicate 
> > > > > > > > > whether it was initialized could be cleaner?
> > > > > > > > Another idea: Adding a helper struct to contain the bool 
> > > > > > > > `initialized`? E.g. (draft):
> > > > > > > > ```
> > > > > > > > struct LazyOptional {
> > > > > > > >   bool initialized = false;
> > > > > > > >   Opt<int> value;
> > > > > > > >   Opt& get();
> > > > > > > >   void set(const Opt&);
> > > > > > > > };
> > > > > > > > ```
> > > > > > > It may be OK to have a function `lazyInitKernelZeroSizePtrValue`?
> > > > > > I don't insist, given we have a better described type for 
> > > > > > `KernelZeroSizePtrValue` (e.g. having a `using` `template`)
> > > > > `AnalysisManager` has access to the `Preprocessor`, and it is also 
> > > > > responsible for the construction of the `CheckerManager` object. This 
> > > > > would make moving such code to the checker registry function! I'll 
> > > > > gladly take this issue off your hand and patch it in once 
> > > > > rG2aac0c47aed8d1eff7ab6d858173c532b881d948 settles :)
> > > > Just pushed rG4dc8472942ce60f29de9587b9451cc3d49df7abf. It it settles 
> > > > (no buildbots complain), you could rebase and the lazy initialization 
> > > > could be a thing of the past! :)
> > > This makes it possible to have a generic one-time initialization function 
> > > in the checker (`CheckerBase`)? The functionality is needed in more than 
> > > one checker, at least for the bug types it can be used in almost every 
> > > checker (that has bugtypes).
> > I'm not sure I understand what you mean -- do you want to add 
> > `CheckerManager` to `CheckerBase`'s constructor?
> > 
> > In any case, I remember reading something around `CheckerBase`'s or 
> > `BugType`'s implementation the way the checker receives its name is a bit 
> > tricky and not a part of the construction.
> Initialization in register function does not work: The `MacroInfo` is not 
> found in the preprocessor. Probably the code is not parsed normally at that 
> time. For now only the lazy initialization is working.
> Initialization in register function does not work: The MacroInfo is not found 
> in the preprocessor. Probably the code is not parsed normally at that time. 
> For now only the lazy initialization is working.

Well that is super annoying. I don't object to the lazy initialization then.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp:1692-1694
+    // If there is a macro called ZERO_SIZE_PTR, it could be a kernel source 
code
+    // and this value indicates a special value used for a zero-sized memory
+    // block. It is a constant value that is allowed to be freed.
----------------
Just a bit of word smithing :)

If the macro ZERO_SIZE_PTR is defined, this could be a kernel source code. In 
that case, the ZERO_SIZE_PTR defines indicates a special value used for a 
zero-sized memory block which is allowed to be freed, despite not being a null 
pointer.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D76830/new/

https://reviews.llvm.org/D76830



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to