From 5efbc48dd88d5379f2903f82872d878dd31b327b Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Mon, 14 Feb 2011 11:52:36 +0100 Subject: [PATCH 1/1] Be more picky when parsing options. --- options.cpp | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/options.cpp b/options.cpp index f3e2be3..cf9bb0f 100644 --- a/options.cpp +++ b/options.cpp @@ -93,6 +93,8 @@ namespace { // local helper class class opt_helper { public: + template + static bool parse_arg(char opt, const char *arg, T& val); static const char* on_off(bool b); const char* descr(const char* str); template @@ -109,6 +111,16 @@ namespace { } // namespace +template +bool opt_helper::parse_arg(char opt, const char *arg, T& val) +{ + std::istringstream str(arg); + bool result = (str >> val) && str.eof(); + if (!result) + XBT_ERROR("invalid argument for option '-%c' -- \"%s\"", opt, arg); + return result; +} + const char* opt_helper::on_off(bool b) { return b ? "on" : "off"; @@ -178,6 +190,8 @@ bool opt::parse_args(int* argc, char* argv[]) opt::program_name = argv[0]; opt::program_name.erase(0, 1 + opt::program_name.find_last_of('/')); + +#define PARSE_ARG(x) result = opt_helper::parse_arg(c, optarg, (x)) && result int c; opterr = 0; @@ -200,34 +214,44 @@ bool opt::parse_args(int* argc, char* argv[]) opt::help_requested++; break; case 'c': - opt::comp_cost = cost_func(optarg); + try { + opt::comp_cost = cost_func(optarg); + } catch (...) { + XBT_ERROR("invalid argument for option '-%c' -- \"%s\"", c, optarg); + result = false; + } break; case 'C': - opt::comm_cost = cost_func(optarg); + try { + opt::comm_cost = cost_func(optarg); + } catch (...) { + XBT_ERROR("invalid argument for option '-%c' -- \"%s\"", c, optarg); + result = false; + } break; case 'i': - std::istringstream(optarg) >> opt::lb_maxiter; + PARSE_ARG(opt::lb_maxiter); break; case 'I': - std::istringstream(optarg) >> opt::comp_maxiter; + PARSE_ARG(opt::comp_maxiter); break; case 'l': - std::istringstream(optarg) >> opt::log_rate; + PARSE_ARG(opt::log_rate); break; case 'L': - std::istringstream(optarg) >> opt::auto_depl::load; + PARSE_ARG(opt::auto_depl::load); break; case 'N': - std::istringstream(optarg) >> opt::auto_depl::nhosts; + PARSE_ARG(opt::auto_depl::nhosts); break; case 's': - std::istringstream(optarg) >> opt::min_lb_iter_duration; + PARSE_ARG(opt::min_lb_iter_duration); break; case 'S': - std::istringstream(optarg) >> opt::min_comp_iter_duration; + PARSE_ARG(opt::min_comp_iter_duration); break; case 't': - std::istringstream(optarg) >> opt::time_limit; + PARSE_ARG(opt::time_limit); break; case 'T': opt::auto_depl::topology = optarg; @@ -249,6 +273,8 @@ bool opt::parse_args(int* argc, char* argv[]) } } +#undef PARSE_ARG + if (opt::version_requested || opt::help_requested) return 1; -- 2.39.5