brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · f9046d7 Raw
65 lines · plain
1// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.MemoryUnsafeCastChecker -verify %s2 3@protocol NSObject4+alloc;5-init;6@end7 8@interface NSObject <NSObject> {}9@end10 11@interface BaseClass : NSObject12@end13 14@interface DerivedClass : BaseClass15-(void)testCasts:(BaseClass*)base;16@end17 18@implementation DerivedClass19-(void)testCasts:(BaseClass*)base {20  DerivedClass *derived = (DerivedClass*)base;21  // expected-warning@-1{{Unsafe cast from base type 'BaseClass' to derived type 'DerivedClass'}}22  DerivedClass *derived_static = static_cast<DerivedClass*>(base);23  // expected-warning@-1{{Unsafe cast from base type 'BaseClass' to derived type 'DerivedClass'}}24  DerivedClass *derived_reinterpret = reinterpret_cast<DerivedClass*>(base);25  // expected-warning@-1{{Unsafe cast from base type 'BaseClass' to derived type 'DerivedClass'}}26  base = (BaseClass*)derived;  // no warning27  base = (BaseClass*)base;  // no warning28}29@end30 31template <typename T>32class WrappedObject33{34public:35  T get() const { return mMetalObject; }36  T mMetalObject = nullptr;37};38 39@protocol MTLCommandEncoder40@end41@protocol MTLRenderCommandEncoder42@end43class CommandEncoder : public WrappedObject<id<MTLCommandEncoder>> { };44 45class RenderCommandEncoder final : public CommandEncoder46{47private:48    id<MTLRenderCommandEncoder> get()49    {50        return static_cast<id<MTLRenderCommandEncoder>>(CommandEncoder::get());51    }52};53 54@interface Class155@end56 57@interface Class258@end59 60void testUnrelated(Class1 *c1) {61  Class2 *c2 = (Class2*)c1;62  // expected-warning@-1{{Unsafe cast from type 'Class1' to an unrelated type 'Class2'}}63  Class1 *c1_same = reinterpret_cast<Class1*>(c1); // no warning64}65