Reject TF_XLA_FLAGS if any entries are not recognized.

Previously, we'd silently ignore unrecognized flags.

PiperOrigin-RevId: 219226600
This commit is contained in:
Justin Lebar 2018-10-29 18:02:50 -07:00 committed by TensorFlower Gardener
parent 43fa3ee96e
commit e0af1577de
2 changed files with 26 additions and 14 deletions

View File

@ -174,6 +174,16 @@ bool ParseFlagsFromEnv(const std::vector<tensorflow::Flag>& flag_list) {
SetArgvFromEnv(env_argv); // a no-op if already initialized SetArgvFromEnv(env_argv); // a no-op if already initialized
bool result = bool result =
tensorflow::Flags::Parse(&env_argv->argc, &env_argv->argv[0], flag_list); tensorflow::Flags::Parse(&env_argv->argc, &env_argv->argv[0], flag_list);
// Fail if any flags were not recognized, ignoring argv[0], which
// SetArgvFromEnv ensures is always present.
if (result && env_argv->argc > 1) {
result = false;
for (int64 i = 1; i < env_argv->argc; ++i) {
LOG(ERROR) << "Unrecognized TF_XLA_FLAGS flag: " << env_argv->argv[i];
}
}
env_argv_mu.unlock(); env_argv_mu.unlock();
return result; return result;
} }

View File

@ -40,19 +40,6 @@ static void TestParseFlagsFromEnv(const char* msg) {
std::vector<char*>* pargv; std::vector<char*>* pargv;
ResetFlagsFromEnvForTesting(&pargc, &pargv); ResetFlagsFromEnvForTesting(&pargc, &pargv);
// Ensure that environment variable can be parsed when
// no flags are expected.
std::vector<tensorflow::Flag> empty_flag_list;
bool parsed_ok = ParseFlagsFromEnv(empty_flag_list);
CHECK(parsed_ok) << msg;
const std::vector<char*>& argv_first = *pargv;
CHECK_NE(argv_first[0], nullptr) << msg;
int i = 0;
while (argv_first[i] != nullptr) {
i++;
}
CHECK_EQ(i, *pargc) << msg;
// Check that actual flags can be parsed. // Check that actual flags can be parsed.
bool simple = false; bool simple = false;
string with_value; string with_value;
@ -66,7 +53,7 @@ static void TestParseFlagsFromEnv(const char* msg) {
tensorflow::Flag("single_quoted", &single_quoted, ""), tensorflow::Flag("single_quoted", &single_quoted, ""),
tensorflow::Flag("double_quoted", &double_quoted, ""), tensorflow::Flag("double_quoted", &double_quoted, ""),
}; };
parsed_ok = ParseFlagsFromEnv(flag_list); bool parsed_ok = ParseFlagsFromEnv(flag_list);
CHECK_EQ(*pargc, 1) << msg; CHECK_EQ(*pargc, 1) << msg;
const std::vector<char*>& argv_second = *pargv; const std::vector<char*>& argv_second = *pargv;
CHECK_NE(argv_second[0], nullptr) << msg; CHECK_NE(argv_second[0], nullptr) << msg;
@ -94,6 +81,21 @@ TEST(ParseFlagsFromEnv, Basic) {
TestParseFlagsFromEnv("(flags in environment variable)"); TestParseFlagsFromEnv("(flags in environment variable)");
} }
// Test that the environent variable is parsed correctly.
TEST(ParseFlagsFromEnv, UnrecognizedFlag) {
// Prepare environment.
setenv("TF_XLA_FLAGS", "--simple=xyz --foobar", true /*overwrite*/);
int* pargc;
std::vector<char*>* pargv;
ResetFlagsFromEnvForTesting(&pargc, &pargv);
string simple;
std::vector<tensorflow::Flag> flag_list = {
tensorflow::Flag("simple", &simple, ""),
};
EXPECT_FALSE(ParseFlagsFromEnv(flag_list));
}
// Test that a file named by the environent variable is parsed correctly. // Test that a file named by the environent variable is parsed correctly.
TEST(ParseFlagsFromEnv, File) { TEST(ParseFlagsFromEnv, File) {
// environment variables where tmp dir may be specified. // environment variables where tmp dir may be specified.