[clang] 0fbafb5 - [test] Fix memory leak in validateTargetProfile

Vitaly Buka via cfe-commits cfe-commits at lists.llvm.org
Sat Jul 16 16:48:02 PDT 2022


Author: Vitaly Buka
Date: 2022-07-16T16:47:50-07:00
New Revision: 0fbafb5a1c4381ded4bc7f59a5a6091c229faed7

URL: https://github.com/llvm/llvm-project/commit/0fbafb5a1c4381ded4bc7f59a5a6091c229faed7
DIFF: https://github.com/llvm/llvm-project/commit/0fbafb5a1c4381ded4bc7f59a5a6091c229faed7.diff

LOG: [test] Fix memory leak in validateTargetProfile

Unfortunatly fixing leak expose use-after-free if delete more then one
Compilation for the same Driver, so I am changing validateTargetProfile
to create own Driver each time.

The test was added by D122865.

Added: 
    

Modified: 
    clang/unittests/Driver/ToolChainTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/unittests/Driver/ToolChainTest.cpp b/clang/unittests/Driver/ToolChainTest.cpp
index 02ab9e743ebe..64bc616523f0 100644
--- a/clang/unittests/Driver/ToolChainTest.cpp
+++ b/clang/unittests/Driver/ToolChainTest.cpp
@@ -23,6 +23,7 @@
 #include "llvm/Support/VirtualFileSystem.h"
 #include "llvm/Support/raw_ostream.h"
 #include "gtest/gtest.h"
+#include <memory>
 using namespace clang;
 using namespace clang::driver;
 
@@ -388,22 +389,27 @@ struct SimpleDiagnosticConsumer : public DiagnosticConsumer {
   std::vector<SmallString<32>> Errors;
 };
 
-static void validateTargetProfile(StringRef TargetProfile,
-                                  StringRef ExpectTriple, Driver &TheDriver,
-                                  DiagnosticsEngine &Diags) {
-  EXPECT_TRUE(TheDriver.BuildCompilation(
-      {"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"}));
+static void validateTargetProfile(
+    StringRef TargetProfile, StringRef ExpectTriple,
+    IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> &InMemoryFileSystem,
+    DiagnosticsEngine &Diags) {
+  Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem);
+  std::unique_ptr<Compilation> C{TheDriver.BuildCompilation(
+      {"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"})};
+  EXPECT_TRUE(C);
   EXPECT_STREQ(TheDriver.getTargetTriple().c_str(), ExpectTriple.data());
   EXPECT_EQ(Diags.getNumErrors(), 0u);
 }
 
-static void validateTargetProfile(StringRef TargetProfile,
-                                  StringRef ExpectError, Driver &TheDriver,
-                                  DiagnosticsEngine &Diags,
-                                  SimpleDiagnosticConsumer *DiagConsumer,
-                                  unsigned NumOfErrors) {
-  EXPECT_TRUE(TheDriver.BuildCompilation(
-      {"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"}));
+static void validateTargetProfile(
+    StringRef TargetProfile, StringRef ExpectError,
+    IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> &InMemoryFileSystem,
+    DiagnosticsEngine &Diags, SimpleDiagnosticConsumer *DiagConsumer,
+    unsigned NumOfErrors) {
+  Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem);
+  std::unique_ptr<Compilation> C{TheDriver.BuildCompilation(
+      {"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"})};
+  EXPECT_TRUE(C);
   EXPECT_EQ(Diags.getNumErrors(), NumOfErrors);
   EXPECT_STREQ(DiagConsumer->Errors.back().c_str(), ExpectError.data());
   Diags.Clear();
@@ -422,41 +428,40 @@ TEST(DxcModeTest, TargetProfileValidation) {
   auto *DiagConsumer = new SimpleDiagnosticConsumer;
   IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
   DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagConsumer);
-  Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem);
 
-  validateTargetProfile("-Tvs_6_0", "dxil--shadermodel6.0-vertex", TheDriver,
-                        Diags);
-  validateTargetProfile("-Ths_6_1", "dxil--shadermodel6.1-hull", TheDriver,
-                        Diags);
-  validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain", TheDriver,
-                        Diags);
-  validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain", TheDriver,
-                        Diags);
-  validateTargetProfile("-Tgs_6_3", "dxil--shadermodel6.3-geometry", TheDriver,
-                        Diags);
-  validateTargetProfile("-Tps_6_4", "dxil--shadermodel6.4-pixel", TheDriver,
-                        Diags);
-  validateTargetProfile("-Tcs_6_5", "dxil--shadermodel6.5-compute", TheDriver,
-                        Diags);
-  validateTargetProfile("-Tms_6_6", "dxil--shadermodel6.6-mesh", TheDriver,
-                        Diags);
+  validateTargetProfile("-Tvs_6_0", "dxil--shadermodel6.0-vertex",
+                        InMemoryFileSystem, Diags);
+  validateTargetProfile("-Ths_6_1", "dxil--shadermodel6.1-hull",
+                        InMemoryFileSystem, Diags);
+  validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain",
+                        InMemoryFileSystem, Diags);
+  validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain",
+                        InMemoryFileSystem, Diags);
+  validateTargetProfile("-Tgs_6_3", "dxil--shadermodel6.3-geometry",
+                        InMemoryFileSystem, Diags);
+  validateTargetProfile("-Tps_6_4", "dxil--shadermodel6.4-pixel",
+                        InMemoryFileSystem, Diags);
+  validateTargetProfile("-Tcs_6_5", "dxil--shadermodel6.5-compute",
+                        InMemoryFileSystem, Diags);
+  validateTargetProfile("-Tms_6_6", "dxil--shadermodel6.6-mesh",
+                        InMemoryFileSystem, Diags);
   validateTargetProfile("-Tas_6_7", "dxil--shadermodel6.7-amplification",
-                        TheDriver, Diags);
-  validateTargetProfile("-Tlib_6_x", "dxil--shadermodel6.15-library", TheDriver,
-                        Diags);
+                        InMemoryFileSystem, Diags);
+  validateTargetProfile("-Tlib_6_x", "dxil--shadermodel6.15-library",
+                        InMemoryFileSystem, Diags);
 
   // Invalid tests.
-  validateTargetProfile("-Tpss_6_1", "invalid profile : pss_6_1", TheDriver,
-                        Diags, DiagConsumer, 1);
-
-  validateTargetProfile("-Tps_6_x", "invalid profile : ps_6_x", TheDriver,
-                        Diags, DiagConsumer, 2);
-  validateTargetProfile("-Tlib_6_1", "invalid profile : lib_6_1", TheDriver,
-                        Diags, DiagConsumer, 3);
-  validateTargetProfile("-Tfoo", "invalid profile : foo", TheDriver, Diags,
-                        DiagConsumer, 4);
-  validateTargetProfile("", "target profile option (-T) is missing", TheDriver,
-                        Diags, DiagConsumer, 5);
+  validateTargetProfile("-Tpss_6_1", "invalid profile : pss_6_1",
+                        InMemoryFileSystem, Diags, DiagConsumer, 1);
+
+  validateTargetProfile("-Tps_6_x", "invalid profile : ps_6_x",
+                        InMemoryFileSystem, Diags, DiagConsumer, 2);
+  validateTargetProfile("-Tlib_6_1", "invalid profile : lib_6_1",
+                        InMemoryFileSystem, Diags, DiagConsumer, 3);
+  validateTargetProfile("-Tfoo", "invalid profile : foo", InMemoryFileSystem,
+                        Diags, DiagConsumer, 4);
+  validateTargetProfile("", "target profile option (-T) is missing",
+                        InMemoryFileSystem, Diags, DiagConsumer, 5);
 }
 
 TEST(DxcModeTest, ValidatorVersionValidation) {


        


More information about the cfe-commits mailing list