Do not delete polymorphic objects without a virtual destructor (#23705)
authorOmair Majid <omajid@redhat.com>
Fri, 7 Jun 2019 20:49:52 +0000 (16:49 -0400)
committerJan Vorlicek <janvorli@microsoft.com>
Fri, 7 Jun 2019 20:49:52 +0000 (22:49 +0200)
SEI CERT C++ Coding Standard says:

> Do not delete an object of derived class type through a pointer to its
> base class type that has a non-virtual destructor. Instead, the base
> class should be defined with a virtual destructor. Deleting an object
> through a pointer to a type without a virtual destructor results in
> undefined behavior.

See https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP52-CPP.+Do+not+delete+a+polymorphic+object+without+a+virtual+destructor

Clang generally warns about this, but we disabled the warning via
-Wno-delete-non-virtual-dtor. This commit re-enables the warning and
fixes up all the code that hits the warning.

src/ToolBox/SOS/lldbplugin/CMakeLists.txt
src/ToolBox/SOS/lldbplugin/inc/lldbservices.h
src/ToolBox/SOS/lldbplugin/services.h
src/dlls/mscorpe/CMakeLists.txt
src/ilasm/CMakeLists.txt
src/ilasm/asmparse.h
src/inc/iceefilegen.h

index fadb374..6a279ed 100644 (file)
@@ -124,8 +124,6 @@ endif()
 
 message(STATUS "LLDB_H: ${LLDB_H}")
 
-add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wno-delete-non-virtual-dtor>)
-
 include_directories(inc)
 include_directories("${LLDB_H}")
 include_directories(${CLR_DIR}/src/debug/inc)
index ffb2224..7bb9b1a 100644 (file)
@@ -237,6 +237,7 @@ MIDL_INTERFACE("2E6C569A-9E14-4DA4-9DFC-CDB73A532566")
 ILLDBServices : public IUnknown
 {
 public:
+
     //----------------------------------------------------------------------------
     // ILLDBServices
     //----------------------------------------------------------------------------
index 6509040..a8fb32f 100644 (file)
@@ -26,7 +26,7 @@ private:
 
 public:
     LLDBServices(lldb::SBDebugger &debugger, lldb::SBCommandReturnObject &returnObject, lldb::SBProcess *process = nullptr, lldb::SBThread *thread = nullptr);
-    ~LLDBServices();
+    virtual ~LLDBServices();
  
     //----------------------------------------------------------------------------
     // IUnknown
index 6a89193..eb8489c 100644 (file)
@@ -9,10 +9,6 @@ set(MSCORPE_SOURCES
   ceefilegenwritertokens.cpp
 )
 
-if(NOT WIN32)
-  add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-Wno-delete-non-virtual-dtor>)
-endif()
-
 add_library_clr(mscorpe STATIC
   ${MSCORPE_SOURCES}
 )
index f780dca..6117030 100644 (file)
@@ -51,7 +51,7 @@ if(CLR_CMAKE_PLATFORM_UNIX)
   # Need generate a right form of asmparse.cpp to avoid the following options.
   # Clang also produces a bad-codegen on this prebuilt file with optimization.
   # https://github.com/dotnet/coreclr/issues/2305
-  add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-Wno-delete-non-virtual-dtor;-Wno-register>")
+  add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-Wno-register>")
   add_compile_options(-Wno-array-bounds)
   add_compile_options(-Wno-unused-label)
   set_source_files_properties( prebuilt/asmparse.cpp PROPERTIES COMPILE_FLAGS "-O0" )
index 3c18f35..9d0c841 100644 (file)
@@ -19,6 +19,8 @@
 class ReadStream {
 public:
 
+    virtual ~ReadStream() = default;
+
     virtual unsigned getAll(__out char** ppch) = 0;
 
     // read at most 'buffLen' bytes into 'buff', Return the
@@ -276,7 +278,7 @@ class AsmParse : public ErrorReporter
 {
 public:
     AsmParse(ReadStream* stream, Assembler *aAssem);
-    ~AsmParse();
+    virtual ~AsmParse();
     void CreateEnvironment(ReadStream* stream);
        void ParseFile(ReadStream* stream); 
         // The parser knows how to put line numbers on things and report the error 
index 7fa31d2..65289f4 100644 (file)
@@ -76,6 +76,8 @@ typedef HRESULT (__stdcall * PFN_DestroyICeeFileGen)(ICeeFileGen ** ceeFileGen);
 
 class ICeeFileGen {
   public:
+    virtual ~ICeeFileGen() = default;
+
     virtual HRESULT CreateCeeFile(HCEEFILE *ceeFile); // call this to instantiate a file handle
 
     // <TODO>@FUTURE: remove this function. We no longer support mdScope.</TODO>