Explorar o código

Merge topic 'foreach-range-issues' into release-3.17

185d1aefaa foreach: Set fatal error on invalid range
a33b3949e5 foreach: Fix crash when parsing invalid integer

Acked-by: Kitware Robot <[email protected]>
Merge-request: !4407
Brad King %!s(int64=5) %!d(string=hai) anos
pai
achega
18c8fbcb0b
Modificáronse 23 ficheiros con 92 adicións e 6 borrados
  1. 36 6
      Source/cmForEachCommand.cxx
  2. 7 0
      Tests/RunCMake/foreach/RunCMakeTest.cmake
  3. 1 0
      Tests/RunCMake/foreach/foreach-RANGE-invalid-test-result.txt
  4. 4 0
      Tests/RunCMake/foreach/foreach-RANGE-invalid-test-stderr.txt
  5. 2 0
      Tests/RunCMake/foreach/foreach-RANGE-invalid-test.cmake
  6. 1 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-1-result.txt
  7. 4 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-1-stderr.txt
  8. 2 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-1.cmake
  9. 1 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-1-result.txt
  10. 4 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-1-stderr.txt
  11. 2 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-1.cmake
  12. 1 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-2-result.txt
  13. 4 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-2-stderr.txt
  14. 2 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-2.cmake
  15. 1 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-1-result.txt
  16. 4 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-1-stderr.txt
  17. 2 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-1.cmake
  18. 1 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-2-result.txt
  19. 4 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-2-stderr.txt
  20. 2 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-2.cmake
  21. 1 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-3-result.txt
  22. 4 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-3-stderr.txt
  23. 2 0
      Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-3.cmake

+ 36 - 6
Source/cmForEachCommand.cxx

@@ -12,6 +12,8 @@
 #include <cstdlib>
 #include <iterator>
 #include <map>
+#include <sstream>
+#include <stdexcept>
 #include <utility>
 
 #include <cm/memory>
@@ -354,6 +356,21 @@ bool HandleInMode(std::vector<std::string> const& args,
   return true;
 }
 
+bool TryParseInteger(cmExecutionStatus& status, const std::string& str, int& i)
+{
+  try {
+    i = std::stoi(str);
+  } catch (std::invalid_argument&) {
+    std::ostringstream e;
+    e << "Invalid integer: '" << str << "'";
+    status.SetError(e.str());
+    cmSystemTools::SetFatalErrorOccured();
+    return false;
+  }
+
+  return true;
+}
+
 } // anonymous namespace
 
 bool cmForEachCommand(std::vector<std::string> const& args,
@@ -376,16 +393,28 @@ bool cmForEachCommand(std::vector<std::string> const& args,
       int stop = 0;
       int step = 0;
       if (args.size() == 3) {
-        stop = std::stoi(args[2]);
+        if (!TryParseInteger(status, args[2], stop)) {
+          return false;
+        }
       }
       if (args.size() == 4) {
-        start = std::stoi(args[2]);
-        stop = std::stoi(args[3]);
+        if (!TryParseInteger(status, args[2], start)) {
+          return false;
+        }
+        if (!TryParseInteger(status, args[3], stop)) {
+          return false;
+        }
       }
       if (args.size() == 5) {
-        start = std::stoi(args[2]);
-        stop = std::stoi(args[3]);
-        step = std::stoi(args[4]);
+        if (!TryParseInteger(status, args[2], start)) {
+          return false;
+        }
+        if (!TryParseInteger(status, args[3], stop)) {
+          return false;
+        }
+        if (!TryParseInteger(status, args[4], step)) {
+          return false;
+        }
       }
       if (step == 0) {
         if (start > stop) {
@@ -399,6 +428,7 @@ bool cmForEachCommand(std::vector<std::string> const& args,
         status.SetError(
           cmStrCat("called with incorrect range specification: start ", start,
                    ", stop ", stop, ", step ", step));
+        cmSystemTools::SetFatalErrorOccured();
         return false;
       }
 

+ 7 - 0
Tests/RunCMake/foreach/RunCMakeTest.cmake

@@ -12,3 +12,10 @@ run_cmake(foreach-ZIP_LISTS-with-LISTS-mix-test)
 run_cmake(foreach-ZIP_LISTS-multiple-iter-vars-test)
 run_cmake(foreach-ZIP_LISTS-iter-vars-mismatch-test-1)
 run_cmake(foreach-ZIP_LISTS-iter-vars-mismatch-test-2)
+run_cmake(foreach-RANGE-non-int-test-1)
+run_cmake(foreach-RANGE-non-int-test-2-1)
+run_cmake(foreach-RANGE-non-int-test-2-2)
+run_cmake(foreach-RANGE-non-int-test-3-1)
+run_cmake(foreach-RANGE-non-int-test-3-2)
+run_cmake(foreach-RANGE-non-int-test-3-3)
+run_cmake(foreach-RANGE-invalid-test)

+ 1 - 0
Tests/RunCMake/foreach/foreach-RANGE-invalid-test-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/foreach/foreach-RANGE-invalid-test-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at foreach-RANGE-invalid-test\.cmake:[0-9]+ \(foreach\):
+  foreach called with incorrect range specification: start 2, stop 1, step 1
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:3 \(include\)$

+ 2 - 0
Tests/RunCMake/foreach/foreach-RANGE-invalid-test.cmake

@@ -0,0 +1,2 @@
+foreach(a RANGE 2 1 1)
+endforeach()

+ 1 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-1-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-1-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at foreach-RANGE-non-int-test-1\.cmake:[0-9]+ \(foreach\):
+  foreach Invalid integer: 'b'
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:3 \(include\)$

+ 2 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-1.cmake

@@ -0,0 +1,2 @@
+foreach(a RANGE b)
+endforeach()

+ 1 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-1-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-1-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at foreach-RANGE-non-int-test-2-1\.cmake:[0-9]+ \(foreach\):
+  foreach Invalid integer: 'b'
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:3 \(include\)$

+ 2 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-1.cmake

@@ -0,0 +1,2 @@
+foreach(a RANGE b 1)
+endforeach()

+ 1 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-2-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-2-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at foreach-RANGE-non-int-test-2-2\.cmake:[0-9]+ \(foreach\):
+  foreach Invalid integer: 'b'
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:3 \(include\)$

+ 2 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-2-2.cmake

@@ -0,0 +1,2 @@
+foreach(a RANGE 1 b)
+endforeach()

+ 1 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-1-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-1-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at foreach-RANGE-non-int-test-3-1\.cmake:[0-9]+ \(foreach\):
+  foreach Invalid integer: 'b'
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:3 \(include\)$

+ 2 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-1.cmake

@@ -0,0 +1,2 @@
+foreach(a RANGE b 1 1)
+endforeach()

+ 1 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-2-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-2-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at foreach-RANGE-non-int-test-3-2\.cmake:[0-9]+ \(foreach\):
+  foreach Invalid integer: 'b'
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:3 \(include\)$

+ 2 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-2.cmake

@@ -0,0 +1,2 @@
+foreach(a RANGE 1 b 1)
+endforeach()

+ 1 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-3-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-3-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at foreach-RANGE-non-int-test-3-3\.cmake:[0-9]+ \(foreach\):
+  foreach Invalid integer: 'b'
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:3 \(include\)$

+ 2 - 0
Tests/RunCMake/foreach/foreach-RANGE-non-int-test-3-3.cmake

@@ -0,0 +1,2 @@
+foreach(a RANGE 1 1 b)
+endforeach()