r342221 - [analyzer][UninitializedObjectChecker] Support for nonloc::LocAsInteger

Ilya Biryukov via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 14 04:30:39 PDT 2018


I've sent a quick workaround restoring final (r342225) to unbreak our
internal buildbots.

On Fri, Sep 14, 2018 at 1:20 PM Ilya Biryukov <ibiryukov at google.com> wrote:

> Ah, the reason why it does not fire on other inheritors is because they're
> final. Any reason to remove final from NeedsCastLocField?
>
> On Fri, Sep 14, 2018 at 1:17 PM Ilya Biryukov <ibiryukov at google.com>
> wrote:
>
>> This introduced revision introduced a new warning:
>> ../tools/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp:62:7:
>> warning: '(anonymous namespace)::NeedsCastLocField' has virtual functions
>> but non-virtual destructor [-Wnon-virtual-dtor]
>>
>> Which is turned into an error on our integrates, so it breaks us. Could
>> you please take a look?
>> A simple workaround would be to make FieldNode destructor virtual.
>> Does that make sense?
>>
>>
>> On Fri, Sep 14, 2018 at 12:19 PM Kristof Umann via cfe-commits <
>> cfe-commits at lists.llvm.org> wrote:
>>
>>> Author: szelethus
>>> Date: Fri Sep 14 03:18:26 2018
>>> New Revision: 342221
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=342221&view=rev
>>> Log:
>>> [analyzer][UninitializedObjectChecker] Support for nonloc::LocAsInteger
>>>
>>> Differential Revision: https://reviews.llvm.org/D49437
>>>
>>> Modified:
>>>
>>> cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp
>>>
>>> cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp
>>>     cfe/trunk/test/Analysis/cxx-uninitialized-object-ptr-ref.cpp
>>>
>>> Modified:
>>> cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp?rev=342221&r1=342220&r2=342221&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp
>>> (original)
>>> +++
>>> cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp
>>> Fri Sep 14 03:18:26 2018
>>> @@ -274,15 +274,15 @@ bool FindUninitializedFields::isNonUnion
>>>        continue;
>>>      }
>>>
>>> -    if (isDereferencableType(T)) {
>>> +    SVal V = State->getSVal(FieldVal);
>>> +
>>> +    if (isDereferencableType(T) || V.getAs<nonloc::LocAsInteger>()) {
>>>        if (isDereferencableUninit(FR, LocalChain))
>>>          ContainsUninitField = true;
>>>        continue;
>>>      }
>>>
>>>      if (isPrimitiveType(T)) {
>>> -      SVal V = State->getSVal(FieldVal);
>>> -
>>>        if (isPrimitiveUninit(V)) {
>>>          if (addFieldToUninits(LocalChain.add(RegularField(FR))))
>>>            ContainsUninitField = true;
>>>
>>> Modified:
>>> cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp?rev=342221&r1=342220&r2=342221&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp
>>> (original)
>>> +++
>>> cfe/trunk/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedPointee.cpp
>>> Fri Sep 14 03:18:26 2018
>>> @@ -57,9 +57,9 @@ public:
>>>    }
>>>  };
>>>
>>> -/// Represents a void* field that needs to be casted back to its
>>> dynamic type
>>> -/// for a correct note message.
>>> -class NeedsCastLocField final : public FieldNode {
>>> +/// Represents a nonloc::LocAsInteger or void* field, that point to
>>> objects, but
>>> +/// needs to be casted back to its dynamic type for a correct note
>>> message.
>>> +class NeedsCastLocField : public FieldNode {
>>>    QualType CastBackType;
>>>
>>>  public:
>>> @@ -71,7 +71,13 @@ public:
>>>    }
>>>
>>>    virtual void printPrefix(llvm::raw_ostream &Out) const override {
>>> -    Out << "static_cast" << '<' << CastBackType.getAsString() << ">(";
>>> +    // If this object is a nonloc::LocAsInteger.
>>> +    if (getDecl()->getType()->isIntegerType())
>>> +      Out << "reinterpret_cast";
>>> +    // If this pointer's dynamic type is different then it's static
>>> type.
>>> +    else
>>> +      Out << "static_cast";
>>> +    Out << '<' << CastBackType.getAsString() << ">(";
>>>    }
>>>
>>>    virtual void printNode(llvm::raw_ostream &Out) const override {
>>> @@ -106,11 +112,12 @@ static llvm::Optional<DereferenceInfo> d
>>>  bool FindUninitializedFields::isDereferencableUninit(
>>>      const FieldRegion *FR, FieldChainInfo LocalChain) {
>>>
>>> -  assert(isDereferencableType(FR->getDecl()->getType()) &&
>>> -         "This method only checks dereferencable objects!");
>>> -
>>>    SVal V = State->getSVal(FR);
>>>
>>> +  assert((isDereferencableType(FR->getDecl()->getType()) ||
>>> +          V.getAs<nonloc::LocAsInteger>()) &&
>>> +         "This method only checks dereferencable objects!");
>>> +
>>>    if (V.isUnknown() || V.getAs<loc::ConcreteInt>()) {
>>>      IsAnyFieldInitialized = true;
>>>      return false;
>>> @@ -196,13 +203,15 @@ static llvm::Optional<DereferenceInfo> d
>>>
>>>    llvm::SmallSet<const TypedValueRegion *, 5> VisitedRegions;
>>>
>>> -  // If the static type of the field is a void pointer, we need to cast
>>> it back
>>> -  // to the dynamic type before dereferencing.
>>> -  bool NeedsCastBack = isVoidPointer(FR->getDecl()->getType());
>>> -
>>>    SVal V = State->getSVal(FR);
>>>    assert(V.getAsRegion() && "V must have an underlying region!");
>>>
>>> +  // If the static type of the field is a void pointer, or it is a
>>> +  // nonloc::LocAsInteger, we need to cast it back to the dynamic type
>>> before
>>> +  // dereferencing.
>>> +  bool NeedsCastBack = isVoidPointer(FR->getDecl()->getType()) ||
>>> +                       V.getAs<nonloc::LocAsInteger>();
>>> +
>>>    // The region we'd like to acquire.
>>>    const auto *R = V.getAsRegion()->getAs<TypedValueRegion>();
>>>    if (!R)
>>>
>>> Modified: cfe/trunk/test/Analysis/cxx-uninitialized-object-ptr-ref.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cxx-uninitialized-object-ptr-ref.cpp?rev=342221&r1=342220&r2=342221&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/Analysis/cxx-uninitialized-object-ptr-ref.cpp
>>> (original)
>>> +++ cfe/trunk/test/Analysis/cxx-uninitialized-object-ptr-ref.cpp Fri Sep
>>> 14 03:18:26 2018
>>> @@ -22,6 +22,24 @@ void fConcreteIntLocTest() {
>>>  }
>>>
>>>
>>>  //===----------------------------------------------------------------------===//
>>> +// nonloc::LocAsInteger tests.
>>>
>>> +//===----------------------------------------------------------------------===//
>>> +
>>> +using intptr_t = long;
>>> +
>>> +struct LocAsIntegerTest {
>>> +  intptr_t ptr; // expected-note{{uninitialized pointee
>>> 'reinterpret_cast<char *>(this->ptr)'}}
>>> +  int dontGetFilteredByNonPedanticMode = 0;
>>> +
>>> +  LocAsIntegerTest(void *ptr) : ptr(reinterpret_cast<intptr_t>(ptr)) {}
>>> // expected-warning{{1 uninitialized field}}
>>> +};
>>> +
>>> +void fLocAsIntegerTest() {
>>> +  char c;
>>> +  LocAsIntegerTest t(&c);
>>> +}
>>> +
>>>
>>> +//===----------------------------------------------------------------------===//
>>>  // Null pointer tests.
>>>
>>>  //===----------------------------------------------------------------------===//
>>>
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>
>>
>> --
>> Regards,
>> Ilya Biryukov
>>
>
>
> --
> Regards,
> Ilya Biryukov
>


-- 
Regards,
Ilya Biryukov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180914/2ad1448e/attachment-0001.html>


More information about the cfe-commits mailing list