mirror of
https://github.com/reactos/CMake.git
synced 2025-02-19 11:00:58 +00:00
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:
commit
d61a99c3ca
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -0,0 +1 @@
|
||||
1
|
@ -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
Tests/RunCMake/foreach/foreach-RANGE-invalid-test.cmake
Normal file
2
Tests/RunCMake/foreach/foreach-RANGE-invalid-test.cmake
Normal file
@ -0,0 +1,2 @@
|
||||
foreach(a RANGE 2 1 1)
|
||||
endforeach()
|
@ -0,0 +1 @@
|
||||
1
|
@ -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\)$
|
@ -0,0 +1,2 @@
|
||||
foreach(a RANGE b)
|
||||
endforeach()
|
@ -0,0 +1 @@
|
||||
1
|
@ -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\)$
|
@ -0,0 +1,2 @@
|
||||
foreach(a RANGE b 1)
|
||||
endforeach()
|
@ -0,0 +1 @@
|
||||
1
|
@ -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\)$
|
@ -0,0 +1,2 @@
|
||||
foreach(a RANGE 1 b)
|
||||
endforeach()
|
@ -0,0 +1 @@
|
||||
1
|
@ -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\)$
|
@ -0,0 +1,2 @@
|
||||
foreach(a RANGE b 1 1)
|
||||
endforeach()
|
@ -0,0 +1 @@
|
||||
1
|
@ -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\)$
|
@ -0,0 +1,2 @@
|
||||
foreach(a RANGE 1 b 1)
|
||||
endforeach()
|
@ -0,0 +1 @@
|
||||
1
|
@ -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\)$
|
@ -0,0 +1,2 @@
|
||||
foreach(a RANGE 1 1 b)
|
||||
endforeach()
|
Loading…
x
Reference in New Issue
Block a user