================
@@ -105,9 +105,6 @@ void errno_getcwd(char *Buf, size_t Sz) {
     clang_analyzer_eval(errno != 0);   // expected-warning{{TRUE}}
     clang_analyzer_eval(Path == NULL); // expected-warning{{TRUE}}
     if (errno) {}                      // no warning
-  } else if (Path == NULL) {
-    clang_analyzer_eval(errno != 0);   // expected-warning{{TRUE}}
-    if (errno) {}                      // no warning
----------------
steakhal wrote:

How to interpret this:
So after your patch, now we reach the print statement at line 109 with 2 paths, 
one in which `errno` is known to be zero, and also a different path where we 
know it's not zero. This is why the `true` expectation is met, but complains 
about that it also prints `false` for the same line. I know it's hard to wrap 
your head around.

Let's step back. What does this test? We are in a branch when `Path` aka. the 
result of `getcwd` is NULL, aka. we had an error. In this case `errno` should 
indicate the specific error that happened, which means we should know here that 
`errno` is not zero. This is exactly what is enforced by the line 109.

What if on the success path `Path` is equal to `Buf`, which is a top-level 
symbol, thus when compared `Path` against `NULL`, we will have a state-split, 
so we enter this `Path == NULL` branch even on the success path. This is why 
`errno` is known there to be non-zero, hence the new diagnostic.

What is missing I think is a new ` ReturnValueCondition` for the success path 
constraining the return value NOT being null. @balazske WDYT of this reasoning?
Can we have multiple `ReturnValueCondition`s for a summary? I have something 
like `ReturnValueCondition(BO_NE, SingleValue(0))` in mind to add there.

https://github.com/llvm/llvm-project/pull/135720
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to