danix800 added a comment.

In D158707#4621377 <https://reviews.llvm.org/D158707#4621377>, @steakhal wrote:

> In D158707#4621270 <https://reviews.llvm.org/D158707#4621270>, @donat.nagy 
> wrote:
>
>> In D158707#4621135 <https://reviews.llvm.org/D158707#4621135>, @steakhal 
>> wrote:
>>
>>> Oh, so we would canonicalize towards a signed extent type. I see. I think 
>>> I'm okay with that.
>>> However, I think this needs a little bit of polishing and testing when the 
>>> region does not point to the beginning of an array or object, but rather 
>>> inside an object, or like this:
>>>
>>>   int nums[] = {1,2,3};
>>>   char *p = (char*)&nums[1];
>>>   
>>>   clang_analyzer_dumpExtent(p);
>>>   clang_analyzer_dumpElementCount(p);
>>>   ++p;
>>>   clang_analyzer_dumpExtent(p);
>>>   clang_analyzer_dumpElementCount(p);
>>>   ++p;
>>>   int *q = (int*)p;
>>>   clang_analyzer_dumpExtent(q);
>>>   clang_analyzer_dumpElementCount(q);
>>
>> Unfortunately the analyzer engine does not distinguish pointer arithmetic 
>> and element access, and we cannot handle these situations while that 
>> limitation exists. For example, if we have an array `int nums[3];`, then the 
>> element `nums[1]` and the incremented pointer `int *ptr = nums + 1;` are 
>> represented by the same `ElementRegion` object; so we cannot simultaneously 
>> say that (1) `nums[1]` is an int-sized memory region, and (2) it's valid to 
>> access the elements of the array as `ptr[-1]`, `ptr[0]` and `ptr[1]`.
>>
>> The least bad heuristic is probably `RegionRawOffsetV2::computeOffset()` 
>> from ArrayBoundCheckerV2, which strips away all the `ElementRegion` layers, 
>> acting as if they are all coming from pointer arithmetic. This behavior is 
>> incorrect if we want to query the extent/elementcount of a "real" 
>> ElementRegion (e.g. a slice of a multidimensional array or `(char*)&nums[1]` 
>> in your example), but mostly leads to false negatives. On the other hand, if 
>> we process a pointer increment as if it were an element access, we can 
>> easily run into false positive reports -- this is why I had to abandon 
>> D150446 <https://reviews.llvm.org/D150446>.
>>
>> I'd suggest that we should ignore pointer arithmetic in this commit (or 
>> create a testcase that documents the current insufficient behavior) and 
>> remember this as yet another reason to do through rewrite of the memory 
>> model. This is related to the plan 
>> https://github.com/llvm/llvm-project/issues/42709 suggested by @NoQ, but 
>> perhaps it would be enough to do a less drastic change in that direction.
>
> I'm aware of this, and I didn't mean to ask to fix this here.
> I just want to see how these ExprInspection APIs will be affected in these 
> edge-cases, where previously it returned "unknown", and now will return 
> something else.
> It's useful to demonstrate this if we ever come back to this commit.
> Pinning down some tests and having some FIXMEs there should bring enough 
> visibility.

Thank you all for the above valuable information. It's helpful for me to get 
better understanding of CSA!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D158707

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

Reply via email to