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