Chromium Code Reviews| Index: base/tools_sanity_unittest.cc |
| diff --git a/base/tools_sanity_unittest.cc b/base/tools_sanity_unittest.cc |
| index 8d13837887b854a2dfad5178e1c74ed59687bda3..a41ca260494ddc910e0e88ff74882563b238470d 100644 |
| --- a/base/tools_sanity_unittest.cc |
| +++ b/base/tools_sanity_unittest.cc |
| @@ -343,6 +343,8 @@ TEST(ToolsSanityTest, AtomicsAreIgnored) { |
| } |
| #if defined(CFI_ENFORCEMENT) |
| +// TODO(krasin): remove CFI_CAST_CHECK, see https://crbug.com/626794. |
| +#if defined(CFI_CAST_CHECK) |
| TEST(ToolsSanityTest, BadCast) { |
| class A { |
| virtual void f() {} |
| @@ -355,6 +357,32 @@ TEST(ToolsSanityTest, BadCast) { |
| A a; |
| EXPECT_DEATH((void)(B*)&a, "ILL_ILLOPN"); |
| } |
| -#endif |
| +#endif // CFI_CAST_CHECK |
| + |
| +class A { |
| + public: |
| + A(): n_(0) {} |
| + virtual void f() { n_++; } |
| + protected: |
| + int n_; |
| +}; |
| + |
| +class B: public A { |
| + public: |
| + void f() override { n_--; } |
| +}; |
| + |
| +__attribute__((noinline)) void KillVptrAndCall(A *obj) { |
|
pcc1
2016/07/12 18:54:28
Use NOINLINE macro here.
krasin1
2016/07/12 20:30:05
Done.
|
| + *reinterpret_cast<void **>(obj) = 0; |
| + obj->f(); |
| +} |
| + |
| +TEST(ToolsSanityTest, BadVirtualCall) { |
| + A a; |
| + B b; |
| + EXPECT_DEATH({ KillVptrAndCall(&a); KillVptrAndCall(&b); }, "ILL_ILLOPN"); |
| +} |
| + |
| +#endif // CFI_ENFORCEMENT |
| } // namespace base |