NoQ added inline comments.

================
Comment at: clang/lib/StaticAnalyzer/Core/SVals.cpp:151
+  Optional<QualType> VisitNonLocLazyCompoundVal(nonloc::LazyCompoundVal LCV) {
+    return Visit(LCV.getRegion());
+  }
----------------
vsavchenko wrote:
> NoQ wrote:
> > vsavchenko wrote:
> > > NoQ wrote:
> > > > This is correct except you need to get the value type, not the pointer 
> > > > type.
> > > > 
> > > > `LazyCompoundVal` is a `prvalue` and its parent region is the location 
> > > > in which this `prvalue` resided some time in the past. So the parent 
> > > > region is of the right type and it's always typed but you need the 
> > > > pointee type.
> > > OK then, can you maybe hint how can I write a test where this is going to 
> > > be a pointer type (or maybe then `getType` for regions works incorrectly).
> > Regions have `getLocationType()` (the pointer type) and `getValueType()` 
> > (the pointee type). I think you need to call the latter directly in this 
> > case, bypassing recursion.
> > 
> > In order to obtain a live `LazyCompoundVal` specimen for testing purposes, 
> > you need to load an entire compound object (not necessarily represented by 
> > a `CompoundVal`) from Region Store.
> > 
> > Eg.,
> > ```lang=c
> >   struct MyStruct a;
> >   // ...
> >   struct MyStruct b = a; // Avoid C++ though, constructors are a different 
> > beast.
> > ```
> > 
> > Or you could construct one directly. But that, of course, wouldn't give you 
> > any hints about the appropriate type.
> > 
> > > maybe then `getType` for regions works incorrectly
> > 
> > Hmm that's actually a good separate question. How do you know if a region 
> > represents a prvalue of pointer type or a glvalue of pointee type 
> > (including, but not limited to, references)? This can't be figured out 
> > without more context just by looking at the `SVal`.
> > In order to obtain a live LazyCompoundVal specimen for testing purposes.
> That's not a problem:
> ```
> TestUnion d = {.c=b};
> ```
> does produce LazyCompundVal and we don't get a pointer, but the value type.  
> That's why I was asking how I can construct an example when this current 
> implementation fails.
> 
> > Hmm that's actually a good separate question. How do you know if a region 
> > represents a prvalue of pointer type or a glvalue of pointee type 
> > (including, but not limited to, references)? This can't be figured out 
> > without more context just by looking at the SVal.
> Value categories are orthogonal to types, so I don't see why we should care 
> for those in `getType`.  How do you think it should affect this particular 
> functionality?
> `TestUnion d = {.c=b};`

```
(lldb) p D.dump()
compoundVal{ lazyCompoundVal{0x1110b3950,temp_object{struct TestStruct, S1276}}}
```

It's an eager compound value that contains a lazy compound value as the 
initializer for field `.c`.

You're still testing an eager compound value. You never visit the lazy compound 
value recursively.

`MemRegion::getLocationType()` is always a pointer type.

> Value categories are orthogonal to types, so I don't see why we should care 
> for those in `getType`. How do you think it should affect this particular 
> functionality?

The static analyzer basically models operators `*` and `&` as no-op but from 
the perspective of the standard's formalism they jump across objects.

For example, a load from parameter `int *p` would produce a value 
`&SymRegion{reg_$0<p>}` that represents both the rvalue of `p` (which has the 
type `int *`) and the lvalue of `*p` (which is an entirely different object of 
type `int`).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D104550

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

Reply via email to