Merge topic 'foreach-range-issues'

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

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !4407
This commit is contained in:
Brad King 2020-02-28 16:15:08 +00:00 committed by Kitware Robot
commit d61a99c3ca
23 changed files with 92 additions and 6 deletions

View File

@ -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;
}

View File

@ -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)

View File

@ -0,0 +1 @@
1

View File

@ -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\)$

View File

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

View File

@ -0,0 +1 @@
1

View File

@ -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\)$

View File

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

View File

@ -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\)$

View File

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

View File

@ -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\)$

View File

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

View File

@ -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\)$

View File

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

View File

@ -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\)$

View File

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

View File

@ -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\)$

View File

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