balazske marked an inline comment as done.
balazske added inline comments.

================
Comment at: clang/lib/StaticAnalyzer/Checkers/Errno.h:22
+namespace ento {
+namespace errno_check {
+
----------------
steakhal wrote:
> balazske wrote:
> > steakhal wrote:
> > > I think we can settle on something better. What about calling it simply 
> > > `errno`?
> > Just `errno` may not work because it collides with the "real" errno (that 
> > is a macro).
> Ah, I see. Ugly macros!
> Then why not simply leave it in the `clang::ento` namespace?
It is better to have separate namespaces for the different inter-checker API's. 
Probably more functions will be added later to the `errno_modeling`.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/Errno.h:24-26
+/// Returns if modeling of 'errno' is available.
+/// If not, the other functions here should not be used.
+bool isErrnoAvailable(ProgramStateRef State);
----------------
steakhal wrote:
> NoQ wrote:
> > balazske wrote:
> > > steakhal wrote:
> > > > I don't think we need this.
> > > > In `getErrnoValue()` we should simply return `UnknownVal` if we don't 
> > > > have 'errno.
> > > > And in `setErrnoValue()` we should return the incoming `State` 
> > > > unmodified.
> > > > 
> > > > THat being said, only a top-level `Check::BeginFunction` callback could 
> > > > see an 'errno' uninitialized, which I don't think is a real issue.
> > > > All the rest of the callbacks would run after it's initialized, thus 
> > > > would behave as expected.
> > > > And in case the translation unit doesn't have nor 'errno' variable nor 
> > > > 'errno_location_ish' functions, ignoring these `set/get` functions is 
> > > > actually the expected behavior.
> > > > 
> > > > Having to check `isErrnoAvailable()` would be really an anti-pattern.
> > > These work now if no ErrnoRegion is available. Returning `Optional` seems 
> > > not better than a required check before the call. I think the current 
> > > version is not the best: It can be possible to make assumptions using 
> > > `assume` on the returned `SVal` value, but this must not be done on a 
> > > non-existing errno value. For this case probably `isErrnoAvailable` is 
> > > required to be used.
> > > 
> > > The `isErrnoAvailable` can be useful for a checker that does special 
> > > things only if there is a working errno modeling.
> > > 
> > `UnknownVal` implies that it's an actual value but we don't know which one. 
> > If the value doesn't exist we shouldn't use it. And if the user doesn't 
> > include the appropriate header then the value really doesn't exist in the 
> > translation unit. So flavor-wise I think we shouldn't use `UnknownVal` 
> > here; I'd rather have an `Optional<SVal>`.
> > 
> > Other than that, yeah, I think this is a good suggestion.
> Yeah, probably the `Optional` is a better alternative.
> 
> However, I'd like to explain my reasoning behind my previous suggestion:
> `Unknown` can/should model any values that the analyzer cannot currently 
> reason about: e.g. floating-point numbers.
> In this case, we cannot reason about the `errno`, thus I recommended it.
> 
> My point is, that we shouldn't regress our API for a marginal problem. And 
> according to my reasoning, this seems to be a marginal issue.
> Using `Optional` here is better than the current implementation, but not by 
> much.
> It would still result in a suboptimal coding pattern, where we guard each 
> access to get/set `errno` by an `if` statement. In the cases where we would 
> use the `getOr()` getter, I'm expecting to see the users pass the 
> `UnknownVal()` as the fallback value in most cases anyway.
I have removed now `isErrnoAvailable` and the get function returns `Optional`. 
I am not sure if this is the best option, if more functions will be added (to 
get the errno location, and get and set an "errno state").


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D120310

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

Reply via email to