Author: Mariya Podchishchaeva Date: 2024-07-19T09:33:35+02:00 New Revision: c81366709574bb95bad86011a44e80a7f97f2c56
URL: https://github.com/llvm/llvm-project/commit/c81366709574bb95bad86011a44e80a7f97f2c56 DIFF: https://github.com/llvm/llvm-project/commit/c81366709574bb95bad86011a44e80a7f97f2c56.diff LOG: [clang] Fix static analyzer concerns in #embed code (#99331) 1. Dead code in `LookupEmbedFile`. The loop always exited on the first iteration. This was also causing a bug of not checking all directories provided by `--embed-dir`. 2. Use of uninitialized variable `CurTok` in `LexEmbedParameters`. It was used to initialize the field which seems to be unused. Removed unused field, this way `CurTok` should be initialized by Lex method. Added: clang/test/Preprocessor/embed_search_paths.c Modified: clang/include/clang/Lex/PPEmbedParameters.h clang/lib/Lex/PPDirectives.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Lex/PPEmbedParameters.h b/clang/include/clang/Lex/PPEmbedParameters.h index 51bf908524e7a..c4fb8d02f6f35 100644 --- a/clang/include/clang/Lex/PPEmbedParameters.h +++ b/clang/include/clang/Lex/PPEmbedParameters.h @@ -75,7 +75,6 @@ struct LexEmbedParametersResult { std::optional<PPEmbedParameterIfEmpty> MaybeIfEmptyParam; std::optional<PPEmbedParameterPrefix> MaybePrefixParam; std::optional<PPEmbedParameterSuffix> MaybeSuffixParam; - SourceRange ParamRange; int UnrecognizedParams; size_t PrefixTokenCount() const { diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index a53540b12dee6..4e77df9ec444c 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -1137,7 +1137,9 @@ Preprocessor::LookupEmbedFile(StringRef Filename, bool isAngled, bool OpenFile, SeparateComponents(LookupPath, Entry, Filename, false); llvm::Expected<FileEntryRef> ShouldBeEntry = FM.getFileRef(LookupPath, OpenFile); - return llvm::expectedToOptional(std::move(ShouldBeEntry)); + if (ShouldBeEntry) + return llvm::expectedToOptional(std::move(ShouldBeEntry)); + llvm::consumeError(ShouldBeEntry.takeError()); } return std::nullopt; } @@ -3624,12 +3626,10 @@ Preprocessor::LexEmbedParameters(Token &CurTok, bool ForHasEmbed) { LexEmbedParametersResult Result{}; SmallVector<Token, 2> ParameterTokens; tok::TokenKind EndTokenKind = ForHasEmbed ? tok::r_paren : tok::eod; - Result.ParamRange = {CurTok.getLocation(), CurTok.getLocation()}; auto DiagMismatchedBracesAndSkipToEOD = [&](tok::TokenKind Expected, std::pair<tok::TokenKind, SourceLocation> Matches) { - Result.ParamRange.setEnd(CurTok.getEndLoc()); Diag(CurTok, diag::err_expected) << Expected; Diag(Matches.second, diag::note_matching) << Matches.first; if (CurTok.isNot(tok::eod)) @@ -3638,7 +3638,6 @@ Preprocessor::LexEmbedParameters(Token &CurTok, bool ForHasEmbed) { auto ExpectOrDiagAndSkipToEOD = [&](tok::TokenKind Kind) { if (CurTok.isNot(Kind)) { - Result.ParamRange.setEnd(CurTok.getEndLoc()); Diag(CurTok, diag::err_expected) << Kind; if (CurTok.isNot(tok::eod)) DiscardUntilEndOfDirective(CurTok); @@ -3872,7 +3871,6 @@ Preprocessor::LexEmbedParameters(Token &CurTok, bool ForHasEmbed) { } } } - Result.ParamRange.setEnd(CurTok.getLocation()); return Result; } diff --git a/clang/test/Preprocessor/embed_search_paths.c b/clang/test/Preprocessor/embed_search_paths.c new file mode 100644 index 0000000000000..5cc1bbf9f87a9 --- /dev/null +++ b/clang/test/Preprocessor/embed_search_paths.c @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -std=c23 %s -E -verify --embed-dir=%S --embed-dir=%S/Inputs +// expected-no-diagnostics + +#embed <jk.txt> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits