[analyzer] Get direct binding for specific punned case
authoreinvbri <vince.a.bridgers@ericsson.com>
Sun, 24 Apr 2022 19:05:11 +0000 (14:05 -0500)
committereinvbri <vince.a.bridgers@ericsson.com>
Thu, 5 May 2022 09:53:45 +0000 (04:53 -0500)
commitdf5801806d03c22099c85942134ca3004776016b
treed67d0a457bd568178d4709fe135249ef7f58e91e
parent3497a4f396015c56057b6deb4cebe0caa07ab63a
[analyzer] Get direct binding for specific punned case

Region store was not able to see through this case to the actual
initialized value of STRUCT ff. This change addresses this case by
getting the direct binding. This was found and debugged in a downstream
compiler, with debug guidance from @steakhal. A positive and negative
test case is added.

The specific case where this issue was exposed.

  typedef struct {
    int a:1;
    int b[2];
  } STRUCT;

  int main() {
    STRUCT ff = {0};
    STRUCT* pff = &ff;
    int a = ((int)pff + 1);
    return a;
  }

Reviewed By: steakhal, martong

Differential Revision: https://reviews.llvm.org/D124349
clang/lib/StaticAnalyzer/Core/RegionStore.cpp
clang/test/Analysis/array-punned-region.c [new file with mode: 0644]