Sfoglia il codice sorgente

Fix memory leak in ShaderOpParser::ParseShaderOpSet.

Xiang Li 8 anni fa
parent
commit
6196364aed

+ 4 - 4
tools/clang/unittests/HLSL/ExecutionTest.cpp

@@ -1820,7 +1820,7 @@ RunShaderOpTest(dxc::DxcDllSupport &support, IStream *pStream, LPCSTR pName,
     if (ShaderOpSet->ShaderOps.size() != 1) {
       VERIFY_FAIL(L"Expected a single shader operation.");
     }
-    pShaderOp = &ShaderOpSet->ShaderOps[0];
+    pShaderOp = ShaderOpSet->ShaderOps[0].get();
   }
   else {
     pShaderOp = ShaderOpSet->GetShaderOp(pName);
@@ -1832,7 +1832,7 @@ RunShaderOpTest(dxc::DxcDllSupport &support, IStream *pStream, LPCSTR pName,
     const char sep = ':';
     for (auto &pAvailOp : ShaderOpSet->ShaderOps) {
       msg += sep;
-      msg += pAvailOp.Name ? pAvailOp.Name : "[n/a]";
+      msg += pAvailOp->Name ? pAvailOp->Name : "[n/a]";
     }
     CA2W msgWide(msg.c_str());
     VERIFY_FAIL(msgWide.m_psz);
@@ -2133,7 +2133,7 @@ extern "C" {
           pOutputStrFn(pStrCtx, L"Expected a single shader operation.\r\n");
           return E_FAIL;
         }
-        pShaderOp = &ShaderOpSet->ShaderOps[0];
+        pShaderOp = ShaderOpSet->ShaderOps[0].get();
       }
       else {
         pShaderOp = ShaderOpSet->GetShaderOp(pName);
@@ -2145,7 +2145,7 @@ extern "C" {
         const char sep = ':';
         for (auto &pAvailOp : ShaderOpSet->ShaderOps) {
           msg += sep;
-          msg += pAvailOp.Name ? pAvailOp.Name : "[n/a]";
+          msg += pAvailOp->Name ? pAvailOp->Name : "[n/a]";
         }
         CA2W msgWide(msg.c_str());
         pOutputStrFn(pStrCtx, msgWide);

+ 5 - 6
tools/clang/unittests/HLSL/ShaderOpTest.cpp

@@ -1001,9 +1001,9 @@ void ShaderOpTest::PresentRenderTarget(ShaderOp *pShaderOp,
 }
 
 ShaderOp *ShaderOpSet::GetShaderOp(LPCSTR pName) {
-  for (ShaderOp &S : ShaderOps) {
-    if (S.Name && 0 == _stricmp(pName, S.Name)) {
-      return &S;
+  for (auto &S : ShaderOps) {
+    if (S->Name && 0 == _stricmp(pName, S->Name)) {
+      return S.get();
     }
   }
   return nullptr;
@@ -1718,9 +1718,8 @@ void ShaderOpParser::ParseShaderOpSet(IXmlReader *pReader, ShaderOpSet *pShaderO
       LPCWSTR pLocalName;
       CHECK_HR(pReader->GetLocalName(&pLocalName, nullptr));
       if (0 == wcscmp(pLocalName, L"ShaderOp")) {
-        std::unique_ptr<ShaderOp> S = std::make_unique<ShaderOp>();
-        ParseShaderOp(pReader, S.get());
-        pShaderOpSet->ShaderOps.push_back(*S.release());
+        pShaderOpSet->ShaderOps.emplace_back(std::make_unique<ShaderOp>());
+        ParseShaderOp(pReader, pShaderOpSet->ShaderOps.back().get());
       }
     }
     else if (nt == XmlNodeType_EndElement) {

+ 7 - 1
tools/clang/unittests/HLSL/ShaderOpTest.h

@@ -101,6 +101,12 @@ private:
   std::unordered_set<LPCSTR, HashStr, PredStr> m_values;
   std::vector<std::vector<char>> m_strings;
 public:
+  string_table() {}
+  // Disable copy constructor and move constructor.
+  string_table(const string_table&) = delete;
+  string_table& operator=(const string_table&) = delete;
+  string_table(string_table&&) = delete;
+  string_table& operator=(string_table&&) = delete;
   LPCSTR insert(LPCSTR pValue);
   LPCSTR insert(LPCWSTR pValue);
 };
@@ -208,7 +214,7 @@ public:
 // Use this class to hold a set of shader operations.
 class ShaderOpSet {
 public:
-  std::vector<ShaderOp> ShaderOps;
+  std::vector<std::unique_ptr<ShaderOp>> ShaderOps;
   ShaderOp *GetShaderOp(LPCSTR pName);
 };