Author: Akira Hatanaka Date: 2023-01-05T22:59:07-08:00 New Revision: 34aa2e24c89ae39c0db4254d8aafcae0285dbe34
URL: https://github.com/llvm/llvm-project/commit/34aa2e24c89ae39c0db4254d8aafcae0285dbe34 DIFF: https://github.com/llvm/llvm-project/commit/34aa2e24c89ae39c0db4254d8aafcae0285dbe34.diff LOG: Save the result of getenv() to a string The result has to be saved to a string as the result might be overwritten by subsequent calls to getenv. https://pubs.opengroup.org/onlinepubs/009696899/functions/getenv.html See the discussion here: https://reviews.llvm.org/D137996#4029305 Added: Modified: clang/tools/driver/driver.cpp Removed: ################################################################################ diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp index 126670052421f..0d46f5ec8d1fa 100644 --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -248,11 +248,13 @@ static void getCLEnvVarOptions(std::string &EnvValue, llvm::StringSaver &Saver, template <class T> static T checkEnvVar(const char *EnvOptSet, const char *EnvOptFile, std::string &OptFile) { - T OptVal = ::getenv(EnvOptSet); - if (OptVal) { - if (const char *Var = ::getenv(EnvOptFile)) - OptFile = Var; - } + const char *Str = ::getenv(EnvOptSet); + if (!Str) + return T{}; + + T OptVal = Str; + if (const char *Var = ::getenv(EnvOptFile)) + OptFile = Var; return OptVal; } @@ -264,32 +266,37 @@ static bool SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) { TheDriver.CCPrintHeadersFilename)) { TheDriver.CCPrintHeadersFormat = HIFMT_Textual; TheDriver.CCPrintHeadersFiltering = HIFIL_None; - } else if (const char *EnvVar = checkEnvVar<const char *>( - "CC_PRINT_HEADERS_FORMAT", "CC_PRINT_HEADERS_FILE", - TheDriver.CCPrintHeadersFilename)) { - TheDriver.CCPrintHeadersFormat = stringToHeaderIncludeFormatKind(EnvVar); - if (!TheDriver.CCPrintHeadersFormat) { - TheDriver.Diag(clang::diag::err_drv_print_header_env_var) << 0 << EnvVar; - return false; - } + } else { + std::string EnvVar = checkEnvVar<std::string>( + "CC_PRINT_HEADERS_FORMAT", "CC_PRINT_HEADERS_FILE", + TheDriver.CCPrintHeadersFilename); + if (!EnvVar.empty()) { + TheDriver.CCPrintHeadersFormat = + stringToHeaderIncludeFormatKind(EnvVar.c_str()); + if (!TheDriver.CCPrintHeadersFormat) { + TheDriver.Diag(clang::diag::err_drv_print_header_env_var) + << 0 << EnvVar; + return false; + } - const char *FilteringStr = ::getenv("CC_PRINT_HEADERS_FILTERING"); - HeaderIncludeFilteringKind Filtering; - if (!stringToHeaderIncludeFiltering(FilteringStr, Filtering)) { - TheDriver.Diag(clang::diag::err_drv_print_header_env_var) - << 1 << FilteringStr; - return false; - } + const char *FilteringStr = ::getenv("CC_PRINT_HEADERS_FILTERING"); + HeaderIncludeFilteringKind Filtering; + if (!stringToHeaderIncludeFiltering(FilteringStr, Filtering)) { + TheDriver.Diag(clang::diag::err_drv_print_header_env_var) + << 1 << FilteringStr; + return false; + } - if ((TheDriver.CCPrintHeadersFormat == HIFMT_Textual && - Filtering != HIFIL_None) || - (TheDriver.CCPrintHeadersFormat == HIFMT_JSON && - Filtering != HIFIL_Only_Direct_System)) { - TheDriver.Diag(clang::diag::err_drv_print_header_env_var_combination) - << EnvVar << FilteringStr; - return false; + if ((TheDriver.CCPrintHeadersFormat == HIFMT_Textual && + Filtering != HIFIL_None) || + (TheDriver.CCPrintHeadersFormat == HIFMT_JSON && + Filtering != HIFIL_Only_Direct_System)) { + TheDriver.Diag(clang::diag::err_drv_print_header_env_var_combination) + << EnvVar << FilteringStr; + return false; + } + TheDriver.CCPrintHeadersFiltering = Filtering; } - TheDriver.CCPrintHeadersFiltering = Filtering; } TheDriver.CCLogDiagnostics = _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits