r271708 - Use the name of the file on disk to issue a new diagnostic about non-portable #include and #import paths.
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 3 17:25:07 PDT 2016
I think this should be reverted until we figure out how to solve it.
Moreover, it looks expensive to check for each file if it's within a system
path. I would really like to measure compile time for this change before it
goes definitely in.
On Fri, Jun 3, 2016 at 4:53 PM, Justin Bogner via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Taewook Oh via cfe-commits <cfe-commits at lists.llvm.org> writes:
> > Author: twoh
> > Date: Fri Jun 3 13:52:51 2016
> > New Revision: 271708
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=271708&view=rev
> > Log:
> > Use the name of the file on disk to issue a new diagnostic about
> > non-portable #include and #import paths.
> >
> > Differential Revision: http://reviews.llvm.org/D19843
> > Corresponding LLVM change: http://reviews.llvm.org/D19842
> >
> > Patch by Eric Niebler
> >
> >
> > Added:
> > cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h
> > cfe/trunk/test/Lexer/case-insensitive-include-ms.c
> > cfe/trunk/test/Lexer/case-insensitive-include.c
> > Modified:
> > cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> > cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
> > cfe/trunk/include/clang/Basic/FileManager.h
> > cfe/trunk/include/clang/Basic/VirtualFileSystem.h
> > cfe/trunk/include/clang/Lex/DirectoryLookup.h
> > cfe/trunk/include/clang/Lex/HeaderSearch.h
> > cfe/trunk/lib/Basic/FileManager.cpp
> > cfe/trunk/lib/Basic/VirtualFileSystem.cpp
> > cfe/trunk/lib/Lex/HeaderSearch.cpp
> > cfe/trunk/lib/Lex/PPDirectives.cpp
> > cfe/trunk/test/PCH/case-insensitive-include.c
> >
> > Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> >
> > --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> > +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Fri Jun 3
> 13:52:51 2016
> > @@ -390,6 +390,7 @@ def : DiagGroup<"sequence-point", [Unseq
> > def AmbiguousMacro : DiagGroup<"ambiguous-macro">;
> > def KeywordAsMacro : DiagGroup<"keyword-macro">;
> > def ReservedIdAsMacro : DiagGroup<"reserved-id-macro">;
> > +def NonportableIncludePath : DiagGroup<"nonportable-include-path">;
> >
> > // Just silence warnings about -Wstrict-aliasing for now.
> > def : DiagGroup<"strict-aliasing=0">;
> >
> > Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)
> > +++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Fri Jun 3
> 13:52:51 2016
> > @@ -274,6 +274,10 @@ def ext_missing_whitespace_after_macro_n
> > "whitespace required after macro name">;
> > def warn_missing_whitespace_after_macro_name : Warning<
> > "whitespace recommended after macro name">;
> > +def pp_nonportable_path : Warning<
> > + "non-portable path to file '%0'; specified path differs in case from
> file"
> > + " name on disk">,
> > + InGroup<NonportableIncludePath>;
> >
> > def pp_pragma_once_in_main_file : Warning<"#pragma once in main file">,
> > InGroup<DiagGroup<"pragma-once-outside-header">>;
> >
> > Modified: cfe/trunk/include/clang/Basic/FileManager.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/FileManager.h?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/Basic/FileManager.h (original)
> > +++ cfe/trunk/include/clang/Basic/FileManager.h Fri Jun 3 13:52:51 2016
> > @@ -52,6 +52,7 @@ public:
> > /// descriptor for the file.
> > class FileEntry {
> > const char *Name; // Name of the file.
> > + std::string RealPathName; // Real path to the file; could be empty.
> > off_t Size; // File size in bytes.
> > time_t ModTime; // Modification time of file.
> > const DirectoryEntry *Dir; // Directory file lives in.
> > @@ -82,6 +83,7 @@ public:
> > }
> >
> > const char *getName() const { return Name; }
> > + StringRef tryGetRealPathName() const { return RealPathName; }
> > bool isValid() const { return IsValid; }
> > off_t getSize() const { return Size; }
> > unsigned getUID() const { return UID; }
> >
> > Modified: cfe/trunk/include/clang/Basic/VirtualFileSystem.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/VirtualFileSystem.h?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/Basic/VirtualFileSystem.h (original)
> > +++ cfe/trunk/include/clang/Basic/VirtualFileSystem.h Fri Jun 3
> 13:52:51 2016
> > @@ -91,6 +91,13 @@ public:
> > virtual ~File();
> > /// \brief Get the status of the file.
> > virtual llvm::ErrorOr<Status> status() = 0;
> > + /// \brief Get the name of the file
> > + virtual llvm::ErrorOr<StringRef> getName() {
> > + if (auto Status = status())
> > + return Status->getName();
> > + else
> > + return Status.getError();
> > + }
> > /// \brief Get the contents of the file as a \p MemoryBuffer.
> > virtual llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
> > getBuffer(const Twine &Name, int64_t FileSize = -1,
> >
> > Modified: cfe/trunk/include/clang/Lex/DirectoryLookup.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/DirectoryLookup.h?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/Lex/DirectoryLookup.h (original)
> > +++ cfe/trunk/include/clang/Lex/DirectoryLookup.h Fri Jun 3 13:52:51
> 2016
> > @@ -151,6 +151,9 @@ public:
> > ///
> > /// \param HS The header search instance to search with.
> > ///
> > + /// \param IncludeLoc the source location of the #include or #import
> > + /// directive.
> > + ///
> > /// \param SearchPath If not NULL, will be set to the search path
> relative
> > /// to which the file was found.
> > ///
> > @@ -172,6 +175,7 @@ public:
> > /// a framework include ("Foo.h" -> "Foo/Foo.h"), set the new name to
> this
> > /// vector and point Filename to it.
> > const FileEntry *LookupFile(StringRef &Filename, HeaderSearch &HS,
> > + SourceLocation IncludeLoc,
> > SmallVectorImpl<char> *SearchPath,
> > SmallVectorImpl<char> *RelativePath,
> > Module *RequestingModule,
> >
> > Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/Lex/HeaderSearch.h (original)
> > +++ cfe/trunk/include/clang/Lex/HeaderSearch.h Fri Jun 3 13:52:51 2016
> > @@ -580,8 +580,9 @@ private:
> > /// \brief Look up the file with the specified name and determine its
> owning
> > /// module.
> > const FileEntry *
> > - getFileAndSuggestModule(StringRef FileName, const DirectoryEntry *Dir,
> > - bool IsSystemHeaderDir, Module
> *RequestingModule,
> > + getFileAndSuggestModule(StringRef FileName, SourceLocation IncludeLoc,
> > + const DirectoryEntry *Dir, bool
> IsSystemHeaderDir,
> > + Module *RequestingModule,
> > ModuleMap::KnownHeader *SuggestedModule);
> >
> > public:
> >
> > Modified: cfe/trunk/lib/Basic/FileManager.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/FileManager.cpp?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Basic/FileManager.cpp (original)
> > +++ cfe/trunk/lib/Basic/FileManager.cpp Fri Jun 3 13:52:51 2016
> > @@ -312,6 +312,9 @@ const FileEntry *FileManager::getFile(St
> > UFE.InPCH = Data.InPCH;
> > UFE.File = std::move(F);
> > UFE.IsValid = true;
> > + if (UFE.File)
> > + if (auto RealPathName = UFE.File->getName())
> > + UFE.RealPathName = RealPathName->str();
>
> I'm getting complaints about this line under ASAN on a large number of
> tests locally. Here's the lit output from one of them:
>
>
>
> ********************
> FAIL: Clang :: VFS/relative-path.c (9804 of 26380)
> ******************** TEST 'Clang :: VFS/relative-path.c' FAILED
> ********************
> Script:
> --
> mkdir -p
> /Volumes/NewYork/bogner/build/llvm-san/tools/clang/test/VFS/Output/relative-path.c.tmp
> cd
> /Volumes/NewYork/bogner/build/llvm-san/tools/clang/test/VFS/Output/relative-path.c.tmp
> sed -e
> "s:INPUT_DIR:/Volumes/NewYork/bogner/code/llvm/tools/clang/test/VFS/Inputs:g"
> -e
> "s:OUT_DIR:/Volumes/NewYork/bogner/build/llvm-san/tools/clang/test/VFS/Output/relative-path.c.tmp:g"
> /Volumes/NewYork/bogner/code/llvm/tools/clang/test/VFS/Inputs/vfsoverlay.yaml
> >
> /Volumes/NewYork/bogner/build/llvm-san/tools/clang/test/VFS/Output/relative-path.c.tmp.yaml
> /Users/bogner/build/llvm-san/./bin/clang -cc1 -internal-isystem
> /Volumes/NewYork/bogner/build/llvm-san/bin/../lib/clang/3.9.0/include
> -nostdsysteminc -Werror -I . -ivfsoverlay
> /Volumes/NewYork/bogner/build/llvm-san/tools/clang/test/VFS/Output/relative-path.c.tmp.yaml
> -fsyntax-only
> /Volumes/NewYork/bogner/code/llvm/tools/clang/test/VFS/relative-path.c
> --
> Exit Code: 134
>
> Command Output (stderr):
> --
> =================================================================
> ==77391==ERROR: AddressSanitizer: heap-use-after-free on address
> 0x60700000a580 at pc 0x00011668488f bp 0x7fff5a4930f0 sp 0x7fff5a4928a8
> READ of size 77 at 0x60700000a580 thread T0
> #0 0x11668488e in wrap_memmove asan_interceptors.cc:445
> #1 0x7fff8ad36224 in std::__1::basic_string<char,
> std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char
> const*, unsigned long) (libc++.1.dylib+0x3f224)
> #2 0x10576eb20 in llvm::StringRef::str() const string:2076
> #3 0x108dc4007 in clang::FileManager::getFile(llvm::StringRef, bool,
> bool) FileManager.cpp:317
> #4 0x10cbf5d53 in
> clang::HeaderSearch::getFileAndSuggestModule(llvm::StringRef,
> clang::SourceLocation, clang::DirectoryEntry const*, bool, clang::Module*,
> clang::ModuleMap::KnownHeader*) HeaderSearch.cpp:258
> #5 0x10cbf64d5 in clang::DirectoryLookup::LookupFile(llvm::StringRef&,
> clang::HeaderSearch&, clang::SourceLocation, llvm::SmallVectorImpl<char>*,
> llvm::SmallVectorImpl<char>*, clang::Module*,
> clang::ModuleMap::KnownHeader*, bool&, bool&, llvm::SmallVectorImpl<char>&)
> const HeaderSearch.cpp:302
> #6 0x10cbf96d2 in clang::HeaderSearch::LookupFile(llvm::StringRef,
> clang::SourceLocation, bool, clang::DirectoryLookup const*,
> clang::DirectoryLookup const*&,
> llvm::ArrayRef<std::__1::pair<clang::FileEntry const*,
> clang::DirectoryEntry const*> >, llvm::SmallVectorImpl<char>*,
> llvm::SmallVectorImpl<char>*, clang::Module*,
> clang::ModuleMap::KnownHeader*, bool, bool) HeaderSearch.cpp:717
> #7 0x10cca475e in
> clang::Preprocessor::LookupFile(clang::SourceLocation, llvm::StringRef,
> bool, clang::DirectoryLookup const*, clang::FileEntry const*,
> clang::DirectoryLookup const*&, llvm::SmallVectorImpl<char>*,
> llvm::SmallVectorImpl<char>*, clang::ModuleMap::KnownHeader*, bool)
> PPDirectives.cpp:742
> #8 0x10ccab04a in
> clang::Preprocessor::HandleIncludeDirective(clang::SourceLocation,
> clang::Token&, clang::DirectoryLookup const*, clang::FileEntry const*,
> bool) PPDirectives.cpp:1709
> #9 0x10cca603a in clang::Preprocessor::HandleDirective(clang::Token&)
> PPDirectives.cpp:913
> #10 0x10cc2b042 in clang::Lexer::LexTokenInternal(clang::Token&, bool)
> Lexer.cpp:3671
> #11 0x10cd34636 in clang::Preprocessor::Lex(clang::Token&)
> Preprocessor.cpp:728
> #12 0x10ab0567a in clang::Parser::ConsumeToken() Parser.h:295
> #13 0x10a9bed0d in clang::ParseAST(clang::Sema&, bool, bool)
> ParseAST.cpp:139
> #14 0x10990fbca in clang::FrontendAction::Execute()
> FrontendAction.cpp:457
> #15 0x10985a498 in
> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
> CompilerInstance.cpp:876
> #16 0x1099c1e73 in
> clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
> ExecuteCompilerInvocation.cpp:241
> #17 0x105773f3f in cc1_main(llvm::ArrayRef<char const*>, char const*,
> void*) cc1_main.cpp:116
> #18 0x10576b806 in main driver.cpp:301
> #19 0x7fff9b1545ac in start (libdyld.dylib+0x35ac)
> #20 0xb (<unknown module>)
>
> 0x60700000a580 is located 0 bytes inside of 80-byte region
> [0x60700000a580,0x60700000a5d0)
> freed by thread T0 here:
> #0 0x116699e0b in wrap__ZdlPv asan_new_delete.cc:121
> #1 0x108ed6759 in clang::vfs::File::getName() VirtualFileSystem.h:33
> #2 0x108dc3fba in clang::FileManager::getFile(llvm::StringRef, bool,
> bool) FileManager.cpp:316
> #3 0x10cbf5d53 in
> clang::HeaderSearch::getFileAndSuggestModule(llvm::StringRef,
> clang::SourceLocation, clang::DirectoryEntry const*, bool, clang::Module*,
> clang::ModuleMap::KnownHeader*) HeaderSearch.cpp:258
> #4 0x10cbf64d5 in clang::DirectoryLookup::LookupFile(llvm::StringRef&,
> clang::HeaderSearch&, clang::SourceLocation, llvm::SmallVectorImpl<char>*,
> llvm::SmallVectorImpl<char>*, clang::Module*,
> clang::ModuleMap::KnownHeader*, bool&, bool&, llvm::SmallVectorImpl<char>&)
> const HeaderSearch.cpp:302
> #5 0x10cbf96d2 in clang::HeaderSearch::LookupFile(llvm::StringRef,
> clang::SourceLocation, bool, clang::DirectoryLookup const*,
> clang::DirectoryLookup const*&,
> llvm::ArrayRef<std::__1::pair<clang::FileEntry const*,
> clang::DirectoryEntry const*> >, llvm::SmallVectorImpl<char>*,
> llvm::SmallVectorImpl<char>*, clang::Module*,
> clang::ModuleMap::KnownHeader*, bool, bool) HeaderSearch.cpp:717
> #6 0x10cca475e in
> clang::Preprocessor::LookupFile(clang::SourceLocation, llvm::StringRef,
> bool, clang::DirectoryLookup const*, clang::FileEntry const*,
> clang::DirectoryLookup const*&, llvm::SmallVectorImpl<char>*,
> llvm::SmallVectorImpl<char>*, clang::ModuleMap::KnownHeader*, bool)
> PPDirectives.cpp:742
> #7 0x10ccab04a in
> clang::Preprocessor::HandleIncludeDirective(clang::SourceLocation,
> clang::Token&, clang::DirectoryLookup const*, clang::FileEntry const*,
> bool) PPDirectives.cpp:1709
> #8 0x10cca603a in clang::Preprocessor::HandleDirective(clang::Token&)
> PPDirectives.cpp:913
> #9 0x10cc2b042 in clang::Lexer::LexTokenInternal(clang::Token&, bool)
> Lexer.cpp:3671
> #10 0x10cd34636 in clang::Preprocessor::Lex(clang::Token&)
> Preprocessor.cpp:728
> #11 0x10ab0567a in clang::Parser::ConsumeToken() Parser.h:295
> #12 0x10a9bed0d in clang::ParseAST(clang::Sema&, bool, bool)
> ParseAST.cpp:139
> #13 0x10990fbca in clang::FrontendAction::Execute()
> FrontendAction.cpp:457
> #14 0x10985a498 in
> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
> CompilerInstance.cpp:876
> #15 0x1099c1e73 in
> clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
> ExecuteCompilerInvocation.cpp:241
> #16 0x105773f3f in cc1_main(llvm::ArrayRef<char const*>, char const*,
> void*) cc1_main.cpp:116
> #17 0x10576b806 in main driver.cpp:301
> #18 0x7fff9b1545ac in start (libdyld.dylib+0x35ac)
> #19 0xb (<unknown module>)
>
> previously allocated by thread T0 here:
> #0 0x11669984b in wrap__Znwm asan_new_delete.cc:74
> #1 0x7fff8ad36204 in std::__1::basic_string<char,
> std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char
> const*, unsigned long) (libc++.1.dylib+0x3f204)
> #2 0x108ed92f9 in
> llvm::ErrorOr<clang::vfs::Status>::ErrorOr<clang::vfs::Status&>(clang::vfs::Status&&&,
> std::__1::enable_if<std::is_convertible<clang::vfs::Status&,
> clang::vfs::Status>::value, void>::type*) VirtualFileSystem.h:33
> #3 0x108ee17a7 in (anonymous namespace)::FileWithFixedStatus::status()
> ErrorOr.h:100
> #4 0x108ed65ee in clang::vfs::File::getName() VirtualFileSystem.h:96
> #5 0x108dc3fba in clang::FileManager::getFile(llvm::StringRef, bool,
> bool) FileManager.cpp:316
> #6 0x10cbf5d53 in
> clang::HeaderSearch::getFileAndSuggestModule(llvm::StringRef,
> clang::SourceLocation, clang::DirectoryEntry const*, bool, clang::Module*,
> clang::ModuleMap::KnownHeader*) HeaderSearch.cpp:258
> #7 0x10cbf64d5 in clang::DirectoryLookup::LookupFile(llvm::StringRef&,
> clang::HeaderSearch&, clang::SourceLocation, llvm::SmallVectorImpl<char>*,
> llvm::SmallVectorImpl<char>*, clang::Module*,
> clang::ModuleMap::KnownHeader*, bool&, bool&, llvm::SmallVectorImpl<char>&)
> const HeaderSearch.cpp:302
> #8 0x10cbf96d2 in clang::HeaderSearch::LookupFile(llvm::StringRef,
> clang::SourceLocation, bool, clang::DirectoryLookup const*,
> clang::DirectoryLookup const*&,
> llvm::ArrayRef<std::__1::pair<clang::FileEntry const*,
> clang::DirectoryEntry const*> >, llvm::SmallVectorImpl<char>*,
> llvm::SmallVectorImpl<char>*, clang::Module*,
> clang::ModuleMap::KnownHeader*, bool, bool) HeaderSearch.cpp:717
> #9 0x10cca475e in
> clang::Preprocessor::LookupFile(clang::SourceLocation, llvm::StringRef,
> bool, clang::DirectoryLookup const*, clang::FileEntry const*,
> clang::DirectoryLookup const*&, llvm::SmallVectorImpl<char>*,
> llvm::SmallVectorImpl<char>*, clang::ModuleMap::KnownHeader*, bool)
> PPDirectives.cpp:742
> #10 0x10ccab04a in
> clang::Preprocessor::HandleIncludeDirective(clang::SourceLocation,
> clang::Token&, clang::DirectoryLookup const*, clang::FileEntry const*,
> bool) PPDirectives.cpp:1709
> #11 0x10cca603a in clang::Preprocessor::HandleDirective(clang::Token&)
> PPDirectives.cpp:913
> #12 0x10cc2b042 in clang::Lexer::LexTokenInternal(clang::Token&, bool)
> Lexer.cpp:3671
> #13 0x10cd34636 in clang::Preprocessor::Lex(clang::Token&)
> Preprocessor.cpp:728
> #14 0x10ab0567a in clang::Parser::ConsumeToken() Parser.h:295
> #15 0x10a9bed0d in clang::ParseAST(clang::Sema&, bool, bool)
> ParseAST.cpp:139
> #16 0x10990fbca in clang::FrontendAction::Execute()
> FrontendAction.cpp:457
> #17 0x10985a498 in
> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
> CompilerInstance.cpp:876
> #18 0x1099c1e73 in
> clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
> ExecuteCompilerInvocation.cpp:241
> #19 0x105773f3f in cc1_main(llvm::ArrayRef<char const*>, char const*,
> void*) cc1_main.cpp:116
> #20 0x10576b806 in main driver.cpp:301
> #21 0x7fff9b1545ac in start (libdyld.dylib+0x35ac)
> #22 0xb (<unknown module>)
>
> SUMMARY: AddressSanitizer: heap-use-after-free asan_interceptors.cc:445 in
> wrap_memmove
> Shadow bytes around the buggy address:
> 0x1c0e00001460: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
> 0x1c0e00001470: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
> 0x1c0e00001480: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
> 0x1c0e00001490: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
> 0x1c0e000014a0: fa fa 00 00 00 00 00 00 00 00 00 00 fa fa fa fa
> =>0x1c0e000014b0:[fd]fd fd fd fd fd fd fd fd fd fa fa fa fa fd fd
> 0x1c0e000014c0: fd fd fd fd fd fd fd fd fa fa fa fa 00 00 00 00
> 0x1c0e000014d0: 00 00 00 00 00 00 fa fa fa fa fd fd fd fd fd fd
> 0x1c0e000014e0: fd fd fd fd fa fa fa fa 00 00 00 00 00 00 00 00
> 0x1c0e000014f0: 00 00 fa fa fa fa fd fd fd fd fd fd fd fd fd fd
> 0x1c0e00001500: fa fa fa fa fd fd fd fd fd fd fd fd fd fd fa fa
> Shadow byte legend (one shadow byte represents 8 application bytes):
> Addressable: 00
> Partially addressable: 01 02 03 04 05 06 07
> Heap left redzone: fa
> Heap right redzone: fb
> Freed heap region: fd
> Stack left redzone: f1
> Stack mid redzone: f2
> Stack right redzone: f3
> Stack partial redzone: f4
> Stack after return: f5
> Stack use after scope: f8
> Global redzone: f9
> Global init order: f6
> Poisoned by user: f7
> Container overflow: fc
> Array cookie: ac
> Intra object redzone: bb
> ASan internal: fe
> Left alloca redzone: ca
> Right alloca redzone: cb
> ==77391==ABORTING
> Stack dump:
> 0. Program arguments: /Users/bogner/build/llvm-san/./bin/clang -cc1
> -internal-isystem
> /Volumes/NewYork/bogner/build/llvm-san/bin/../lib/clang/3.9.0/include
> -nostdsysteminc -Werror -I . -ivfsoverlay
> /Volumes/NewYork/bogner/build/llvm-san/tools/clang/test/VFS/Output/relative-path.c.tmp.yaml
> -fsyntax-only
> /Volumes/NewYork/bogner/code/llvm/tools/clang/test/VFS/relative-path.c
> 1.
> /Volumes/NewYork/bogner/code/llvm/tools/clang/test/VFS/relative-path.c:7:2:
> current parser token 'include'
> /Volumes/NewYork/bogner/build/llvm-san/tools/clang/test/VFS/Output/relative-path.c.script:
> line 4: 77391 Abort trap: 6
> /Users/bogner/build/llvm-san/./bin/clang -cc1 -internal-isystem
> /Volumes/NewYork/bogner/build/llvm-san/bin/../lib/clang/3.9.0/include
> -nostdsysteminc -Werror -I . -ivfsoverlay
> /Volumes/NewYork/bogner/build/llvm-san/tools/clang/test/VFS/Output/relative-path.c.tmp.yaml
> -fsyntax-only
> /Volumes/NewYork/bogner/code/llvm/tools/clang/test/VFS/relative-path.c
>
> > return &UFE;
> > }
> >
> >
> > Modified: cfe/trunk/lib/Basic/VirtualFileSystem.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/VirtualFileSystem.cpp?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Basic/VirtualFileSystem.cpp (original)
> > +++ cfe/trunk/lib/Basic/VirtualFileSystem.cpp Fri Jun 3 13:52:51 2016
> > @@ -140,16 +140,19 @@ namespace {
> > class RealFile : public File {
> > int FD;
> > Status S;
> > + std::string RealName;
> > friend class RealFileSystem;
> > - RealFile(int FD, StringRef NewName)
> > + RealFile(int FD, StringRef NewName, StringRef NewRealPathName)
> > : FD(FD), S(NewName, {}, {}, {}, {}, {},
> > - llvm::sys::fs::file_type::status_error, {}) {
> > + llvm::sys::fs::file_type::status_error, {}),
> > + RealName(NewRealPathName.str()) {
> > assert(FD >= 0 && "Invalid or inactive file descriptor");
> > }
> >
> > public:
> > ~RealFile() override;
> > ErrorOr<Status> status() override;
> > + ErrorOr<StringRef> getName() override;
> > ErrorOr<std::unique_ptr<MemoryBuffer>> getBuffer(const Twine &Name,
> > int64_t FileSize,
> > bool
> RequiresNullTerminator,
> > @@ -170,6 +173,10 @@ ErrorOr<Status> RealFile::status() {
> > return S;
> > }
> >
> > +ErrorOr<StringRef> RealFile::getName() {
> > + return RealName.empty() ? S.getName() : StringRef(RealName);
> > +}
> > +
> > ErrorOr<std::unique_ptr<MemoryBuffer>>
> > RealFile::getBuffer(const Twine &Name, int64_t FileSize,
> > bool RequiresNullTerminator, bool IsVolatile) {
> > @@ -207,9 +214,10 @@ ErrorOr<Status> RealFileSystem::status(c
> > ErrorOr<std::unique_ptr<File>>
> > RealFileSystem::openFileForRead(const Twine &Name) {
> > int FD;
> > - if (std::error_code EC = sys::fs::openFileForRead(Name, FD))
> > + SmallString<256> RealName;
> > + if (std::error_code EC = sys::fs::openFileForRead(Name, FD,
> &RealName))
> > return EC;
> > - return std::unique_ptr<File>(new RealFile(FD, Name.str()));
> > + return std::unique_ptr<File>(new RealFile(FD, Name.str(),
> RealName.str()));
> > }
> >
> > llvm::ErrorOr<std::string> RealFileSystem::getCurrentWorkingDirectory()
> const {
> >
> > Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)
> > +++ cfe/trunk/lib/Lex/HeaderSearch.cpp Fri Jun 3 13:52:51 2016
> > @@ -250,8 +250,9 @@ const char *DirectoryLookup::getName() c
> > }
> >
> > const FileEntry *HeaderSearch::getFileAndSuggestModule(
> > - StringRef FileName, const DirectoryEntry *Dir, bool
> IsSystemHeaderDir,
> > - Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule) {
> > + StringRef FileName, SourceLocation IncludeLoc, const DirectoryEntry
> *Dir,
> > + bool IsSystemHeaderDir, Module *RequestingModule,
> > + ModuleMap::KnownHeader *SuggestedModule) {
> > // If we have a module map that might map this header, load it and
> > // check whether we'll have a suggestion for a module.
> > const FileEntry *File = getFileMgr().getFile(FileName,
> /*OpenFile=*/true);
> > @@ -272,6 +273,7 @@ const FileEntry *HeaderSearch::getFileAn
> > const FileEntry *DirectoryLookup::LookupFile(
> > StringRef &Filename,
> > HeaderSearch &HS,
> > + SourceLocation IncludeLoc,
> > SmallVectorImpl<char> *SearchPath,
> > SmallVectorImpl<char> *RelativePath,
> > Module *RequestingModule,
> > @@ -297,7 +299,7 @@ const FileEntry *DirectoryLookup::Lookup
> > RelativePath->append(Filename.begin(), Filename.end());
> > }
> >
> > - return HS.getFileAndSuggestModule(TmpDir, getDir(),
> > + return HS.getFileAndSuggestModule(TmpDir, IncludeLoc, getDir(),
> > isSystemHeaderDirectory(),
> > RequestingModule,
> SuggestedModule);
> > }
> > @@ -585,7 +587,7 @@ const FileEntry *HeaderSearch::LookupFil
> > RelativePath->append(Filename.begin(), Filename.end());
> > }
> > // Otherwise, just return the file.
> > - return getFileAndSuggestModule(Filename, nullptr,
> > + return getFileAndSuggestModule(Filename, IncludeLoc, nullptr,
> > /*IsSystemHeaderDir*/false,
> > RequestingModule, SuggestedModule);
> > }
> > @@ -622,7 +624,7 @@ const FileEntry *HeaderSearch::LookupFil
> > Includer ? getFileInfo(Includer).DirInfo != SrcMgr::C_User :
> > BuildSystemModule;
> > if (const FileEntry *FE = getFileAndSuggestModule(
> > - TmpDir, IncluderAndDir.second, IncluderIsSystemHeader,
> > + TmpDir, IncludeLoc, IncluderAndDir.second,
> IncluderIsSystemHeader,
> > RequestingModule, SuggestedModule)) {
> > if (!Includer) {
> > assert(First && "only first includer can have no file");
> > @@ -713,7 +715,7 @@ const FileEntry *HeaderSearch::LookupFil
> > bool InUserSpecifiedSystemFramework = false;
> > bool HasBeenMapped = false;
> > const FileEntry *FE = SearchDirs[i].LookupFile(
> > - Filename, *this, SearchPath, RelativePath, RequestingModule,
> > + Filename, *this, IncludeLoc, SearchPath, RelativePath,
> RequestingModule,
> > SuggestedModule, InUserSpecifiedSystemFramework, HasBeenMapped,
> > MappedName);
> > if (HasBeenMapped) {
> >
> > Modified: cfe/trunk/lib/Lex/PPDirectives.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Lex/PPDirectives.cpp (original)
> > +++ cfe/trunk/lib/Lex/PPDirectives.cpp Fri Jun 3 13:52:51 2016
> > @@ -24,6 +24,9 @@
> > #include "clang/Lex/ModuleLoader.h"
> > #include "clang/Lex/Pragma.h"
> > #include "llvm/ADT/APInt.h"
> > +#include "llvm/ADT/STLExtras.h"
> > +#include "llvm/ADT/StringExtras.h"
> > +#include "llvm/ADT/iterator_range.h"
> > #include "llvm/Support/ErrorHandling.h"
> > #include "llvm/Support/Path.h"
> > #include "llvm/Support/SaveAndRestore.h"
> > @@ -1556,6 +1559,41 @@ static void diagnoseAutoModuleImport(
> > ("@import " + PathString +
> ";").str());
> > }
> >
> > +namespace {
> > + // Given a vector of path components and a string containing the real
> > + // path to the file, build a properly-cased replacement in the vector,
> > + // and return true if the replacement should be suggested.
> > + bool TrySimplifyPath(SmallVectorImpl<StringRef> &Components,
> > + StringRef RealPathName) {
> > + auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
> > + auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
> > + int Cnt = 0;
> > + bool SuggestReplacement = false;
> > + // Below is a best-effort to handle ".." in paths. It is admittedly
> > + // not 100% correct in the presence of symlinks.
> > + for(auto &Component : llvm::reverse(Components)) {
> > + if ("." == Component) {
> > + } else if (".." == Component) {
> > + ++Cnt;
> > + } else if (Cnt) {
> > + --Cnt;
> > + } else if (RealPathComponentIter != RealPathComponentEnd) {
> > + if (Component != *RealPathComponentIter) {
> > + // If these path components differ by more than just case,
> then we
> > + // may be looking at symlinked paths. Bail on this diagnostic
> to avoid
> > + // noisy false positives.
> > + SuggestReplacement =
> RealPathComponentIter->equals_lower(Component);
> > + if (!SuggestReplacement)
> > + break;
> > + Component = *RealPathComponentIter;
> > + }
> > + ++RealPathComponentIter;
> > + }
> > + }
> > + return SuggestReplacement;
> > + }
> > +}
> > +
> > /// HandleIncludeDirective - The "\#include" tokens have just been
> read, read
> > /// the file to be included from the lexer, then include it! This is a
> common
> > /// routine with functionality shared between \#include, \#include_next
> and
> > @@ -1720,6 +1758,35 @@ void Preprocessor::HandleIncludeDirectiv
> > }
> > }
> >
> > + // Issue a diagnostic if the name of the file on disk has a different
> case
> > + // than the one we're about to open.
> > + const bool CheckIncludePathPortability =
> > + File && !File->tryGetRealPathName().empty();
> > +
> > + if (CheckIncludePathPortability) {
> > + StringRef Name = LangOpts.MSVCCompat ? NormalizedPath.c_str() :
> Filename;
> > + StringRef RealPathName = File->tryGetRealPathName();
> > + SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),
> > + llvm::sys::path::end(Name));
> > +
> > + if (TrySimplifyPath(Components, RealPathName)) {
> > + SmallString<128> Path;
> > + Path.reserve(Name.size()+2);
> > + Path.push_back(isAngled ? '<' : '"');
> > + for (auto Component : Components) {
> > + Path.append(Component);
> > + // Append the separator the user used, or the close quote
> > + Path.push_back(
> > + Path.size() <= Filename.size() ? Filename[Path.size()-1] :
> > + (isAngled ? '>' : '"'));
> > + }
> > + auto Replacement = Path.str().str();
> > + SourceRange Range(FilenameTok.getLocation(), CharEnd);
> > + Diag(FilenameTok, diag::pp_nonportable_path) << Replacement <<
> > + FixItHint::CreateReplacement(Range, Replacement);
> > + }
> > + }
> > +
> > // Should we enter the source file? Set to false if either the source
> file is
> > // known to have no effect beyond its effect on module visibility --
> that is,
> > // if it's got an include guard that is already defined or is a
> modular header
> >
> > Added: cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h?rev=271708&view=auto
> >
> ==============================================================================
> > --- cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h (added)
> > +++ cfe/trunk/test/Lexer/Inputs/case-insensitive-include.h Fri Jun 3
> 13:52:51 2016
> > @@ -0,0 +1,5 @@
> > +#pragma once
> > +
> > +struct S {
> > + int x;
> > +};
> >
> > Added: cfe/trunk/test/Lexer/case-insensitive-include-ms.c
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/case-insensitive-include-ms.c?rev=271708&view=auto
> >
> ==============================================================================
> > --- cfe/trunk/test/Lexer/case-insensitive-include-ms.c (added)
> > +++ cfe/trunk/test/Lexer/case-insensitive-include-ms.c Fri Jun 3
> 13:52:51 2016
> > @@ -0,0 +1,18 @@
> > +// REQUIRES: case-insensitive-filesystem
> > +
> > +// RUN: mkdir -p %T/apath
> > +// RUN: cp %S/Inputs/case-insensitive-include.h %T
> > +// RUN: cd %T
> > +// RUN: %clang_cc1 -fsyntax-only -fms-compatibility %s -include %s -I
> %T -verify
> > +// RUN: %clang_cc1 -fsyntax-only -fms-compatibility
> -fdiagnostics-parseable-fixits %s -include %s -I %T 2>&1 | FileCheck %s
> > +
> > +#include "..\Output\.\case-insensitive-include.h"
> > +#include "..\Output\.\Case-Insensitive-Include.h" // expected-warning
> {{non-portable path}}
> > +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:50}:"\"..\\Output\\.\\case-insensitive-include.h\""
> > +#include "..\output\.\case-insensitive-include.h" // expected-warning
> {{non-portable path}}
> > +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:50}:"\"..\\Output\\.\\case-insensitive-include.h\""
> > +
> > +#include "apath\..\.\case-insensitive-include.h"
> > +#include "apath\..\.\Case-Insensitive-Include.h" // expected-warning
> {{non-portable path}}
> > +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:49}:"\"apath\\..\\.\\case-insensitive-include.h\""
> > +#include "APath\..\.\case-insensitive-include.h" // For the sake of
> efficiency, this case is not diagnosed. :-(
> >
> > Added: cfe/trunk/test/Lexer/case-insensitive-include.c
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/case-insensitive-include.c?rev=271708&view=auto
> >
> ==============================================================================
> > --- cfe/trunk/test/Lexer/case-insensitive-include.c (added)
> > +++ cfe/trunk/test/Lexer/case-insensitive-include.c Fri Jun 3 13:52:51
> 2016
> > @@ -0,0 +1,27 @@
> > +// REQUIRES: case-insensitive-filesystem
> > +
> > +// RUN: mkdir -p %T/apath
> > +// RUN: cp %S/Inputs/case-insensitive-include.h %T
> > +// RUN: cd %T
> > +// RUN: %clang_cc1 -fsyntax-only %s -include %s -I %T -verify
> > +// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s
> -include %s -I %T 2>&1 | FileCheck %s
> > +
> > +#include "case-insensitive-include.h"
> > +#include "Case-Insensitive-Include.h" // expected-warning
> {{non-portable path}}
> > +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:38}:"\"case-insensitive-include.h\""
> > +
> > +#include "../Output/./case-insensitive-include.h"
> > +#include "../Output/./Case-Insensitive-Include.h" // expected-warning
> {{non-portable path}}
> > +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:50}:"\"../Output/./case-insensitive-include.h\""
> > +#include "../output/./case-insensitive-include.h" // expected-warning
> {{non-portable path}}
> > +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:50}:"\"../Output/./case-insensitive-include.h\""
> > +
> > +#include "apath/.././case-insensitive-include.h"
> > +#include "apath/.././Case-Insensitive-Include.h" // expected-warning
> {{non-portable path}}
> > +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:49}:"\"apath/.././case-insensitive-include.h\""
> > +#include "APath/.././case-insensitive-include.h" // For the sake of
> efficiency, this case is not diagnosed. :-(
> > +
> > +#include "../Output/./apath/.././case-insensitive-include.h"
> > +#include "../Output/./APath/.././case-insensitive-include.h" // For the
> sake of efficiency, this case is not diagnosed. :-(
> > +#include "../output/./apath/.././case-insensitive-include.h" //
> expected-warning {{non-portable path}}
> > +// CHECK:
> fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:61}:"\"../Output/./apath/.././case-insensitive-include.h\""
> >
> > Modified: cfe/trunk/test/PCH/case-insensitive-include.c
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/case-insensitive-include.c?rev=271708&r1=271707&r2=271708&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/PCH/case-insensitive-include.c (original)
> > +++ cfe/trunk/test/PCH/case-insensitive-include.c Fri Jun 3 13:52:51
> 2016
> > @@ -2,7 +2,7 @@
> >
> > // Test this without pch.
> > // RUN: cp %S/Inputs/case-insensitive-include.h %T
> > -// RUN: %clang_cc1 -fsyntax-only %s -include %s -I %T -verify
> > +// RUN: %clang_cc1 -Wno-nonportable-include-path -fsyntax-only %s
> -include %s -I %T -verify
> >
> > // Test with pch.
> > // RUN: %clang_cc1 -emit-pch -o %t.pch %s -I %T
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
--
Bruno Cardoso Lopes
http://www.brunocardoso.cc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160603/3a932941/attachment-0001.html>
More information about the cfe-commits
mailing list