Skip to content

Commit ad72c47

Browse files
committed
GDALInConstructionAlgorithmArg::SetDefault(): stricter type checking
Fixes Coverity 1592298 "uncaught exception"
1 parent 19671ee commit ad72c47

File tree

2 files changed

+292
-83
lines changed

2 files changed

+292
-83
lines changed

autotest/cpp/test_gdal_algorithm.cpp

+164-16
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,170 @@ TEST_F(test_gdal_algorithm, GDALAlgorithmArgDecl_SetMaxCount)
101101
2);
102102
}
103103

104+
class MyAlgorithmWithDummyRun : public GDALAlgorithm
105+
{
106+
public:
107+
MyAlgorithmWithDummyRun(const std::string &name = "test",
108+
const std::string &description = "",
109+
const std::string &url = "https://example.com")
110+
: GDALAlgorithm(name, description, url)
111+
{
112+
}
113+
114+
bool RunImpl(GDALProgressFunc, void *) override
115+
{
116+
return true;
117+
}
118+
};
119+
120+
TEST_F(test_gdal_algorithm, GDALAlgorithmArg_SetDefault)
121+
{
122+
123+
class MyAlgorithm : public MyAlgorithmWithDummyRun
124+
{
125+
public:
126+
MyAlgorithm()
127+
{
128+
{
129+
bool v;
130+
auto &arg = AddArg("", 0, "", &v);
131+
arg.SetDefault(true);
132+
EXPECT_TRUE(arg.GetDefault<bool>());
133+
134+
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
135+
CPLErrorReset();
136+
arg.SetDefault("invalid");
137+
EXPECT_EQ(CPLGetLastErrorType(), CE_Failure);
138+
}
139+
140+
{
141+
int v;
142+
auto &arg = AddArg("", 0, "", &v);
143+
arg.SetDefault(5);
144+
EXPECT_EQ(arg.GetDefault<int>(), 5);
145+
146+
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
147+
CPLErrorReset();
148+
arg.SetDefault("invalid");
149+
EXPECT_EQ(CPLGetLastErrorType(), CE_Failure);
150+
}
151+
152+
{
153+
double v;
154+
auto &arg = AddArg("", 0, "", &v);
155+
arg.SetDefault(4.5);
156+
EXPECT_EQ(arg.GetDefault<double>(), 4.5);
157+
158+
arg.SetDefault(5);
159+
EXPECT_EQ(arg.GetDefault<double>(), 5);
160+
161+
arg.SetDefault(2.5f);
162+
EXPECT_EQ(arg.GetDefault<double>(), 2.5);
163+
164+
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
165+
CPLErrorReset();
166+
arg.SetDefault("invalid");
167+
EXPECT_EQ(CPLGetLastErrorType(), CE_Failure);
168+
}
169+
170+
{
171+
std::string v;
172+
auto &arg = AddArg("", 0, "", &v);
173+
174+
arg.SetDefault("ab");
175+
EXPECT_STREQ(arg.GetDefault<std::string>().c_str(), "ab");
176+
177+
arg.SetDefault(std::string("cd"));
178+
EXPECT_STREQ(arg.GetDefault<std::string>().c_str(), "cd");
179+
180+
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
181+
CPLErrorReset();
182+
arg.SetDefault(0);
183+
EXPECT_EQ(CPLGetLastErrorType(), CE_Failure);
184+
}
185+
186+
{
187+
std::vector<int> v;
188+
auto &arg = AddArg("", 0, "", &v);
189+
arg.SetDefault(5);
190+
std::vector<int> expected{5};
191+
EXPECT_EQ(arg.GetDefault<std::vector<int>>(), expected);
192+
193+
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
194+
CPLErrorReset();
195+
arg.SetDefault("invalid");
196+
EXPECT_EQ(CPLGetLastErrorType(), CE_Failure);
197+
}
198+
199+
{
200+
std::vector<double> v;
201+
auto &arg = AddArg("", 0, "", &v);
202+
arg.SetDefault(4.5);
203+
{
204+
std::vector<double> expected{4.5};
205+
EXPECT_EQ(arg.GetDefault<std::vector<double>>(), expected);
206+
}
207+
208+
arg.SetDefault(5);
209+
{
210+
std::vector<double> expected{5};
211+
EXPECT_EQ(arg.GetDefault<std::vector<double>>(), expected);
212+
}
213+
214+
arg.SetDefault(2.5f);
215+
{
216+
std::vector<double> expected{2.5};
217+
EXPECT_EQ(arg.GetDefault<std::vector<double>>(), expected);
218+
}
219+
220+
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
221+
CPLErrorReset();
222+
arg.SetDefault("invalid");
223+
EXPECT_EQ(CPLGetLastErrorType(), CE_Failure);
224+
}
225+
226+
{
227+
std::vector<std::string> v;
228+
auto &arg = AddArg("", 0, "", &v);
229+
230+
arg.SetDefault("ab");
231+
{
232+
std::vector<std::string> expected{"ab"};
233+
EXPECT_EQ(arg.GetDefault<std::vector<std::string>>(),
234+
expected);
235+
}
236+
237+
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
238+
CPLErrorReset();
239+
arg.SetDefault(0);
240+
EXPECT_EQ(CPLGetLastErrorType(), CE_Failure);
241+
}
242+
243+
{
244+
GDALArgDatasetValue v;
245+
auto &arg = AddArg("", 0, "", &v);
246+
247+
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
248+
CPLErrorReset();
249+
arg.SetDefault(0);
250+
EXPECT_EQ(CPLGetLastErrorType(), CE_Failure);
251+
}
252+
253+
{
254+
std::vector<GDALArgDatasetValue> v;
255+
auto &arg = AddArg("", 0, "", &v);
256+
257+
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
258+
CPLErrorReset();
259+
arg.SetDefault(0);
260+
EXPECT_EQ(CPLGetLastErrorType(), CE_Failure);
261+
}
262+
}
263+
};
264+
265+
MyAlgorithm alg;
266+
}
267+
104268
TEST_F(test_gdal_algorithm, GDALAlgorithmArg_Set)
105269
{
106270
{
@@ -783,22 +947,6 @@ TEST_F(test_gdal_algorithm, SetIsCRSArg_wrong_type)
783947
}
784948
}
785949

786-
class MyAlgorithmWithDummyRun : public GDALAlgorithm
787-
{
788-
public:
789-
MyAlgorithmWithDummyRun(const std::string &name = "test",
790-
const std::string &description = "",
791-
const std::string &url = "https://example.com")
792-
: GDALAlgorithm(name, description, url)
793-
{
794-
}
795-
796-
bool RunImpl(GDALProgressFunc, void *) override
797-
{
798-
return true;
799-
}
800-
};
801-
802950
TEST_F(test_gdal_algorithm, wrong_long_name_dash)
803951
{
804952
class MyAlgorithm : public MyAlgorithmWithDummyRun

0 commit comments

Comments
 (0)