[cfe-commits] r117912 - in /cfe/trunk: include/clang/Lex/PreprocessingRecord.h lib/Lex/PreprocessingRecord.cpp lib/Serialization/ASTReader.cpp

Howard Hinnant hhinnant at apple.com
Mon Nov 1 08:10:34 PDT 2010


Looks like an excellent use case for static_assert and std::is_trivially_destructible. ;-)

-Howard

On Nov 1, 2010, at 11:03 AM, Douglas Gregor wrote:

> Author: dgregor
> Date: Mon Nov  1 10:03:47 2010
> New Revision: 117912
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=117912&view=rev
> Log:
> Plug a leak in the preprocessing record's handling of inclusion
> directives. We had a std::string in an object that was allocated via a
> BumpPtrAllocator.
> 
> Modified:
>    cfe/trunk/include/clang/Lex/PreprocessingRecord.h
>    cfe/trunk/lib/Lex/PreprocessingRecord.cpp
>    cfe/trunk/lib/Serialization/ASTReader.cpp
> 
> Modified: cfe/trunk/include/clang/Lex/PreprocessingRecord.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/PreprocessingRecord.h?rev=117912&r1=117911&r2=117912&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/PreprocessingRecord.h (original)
> +++ cfe/trunk/include/clang/Lex/PreprocessingRecord.h Mon Nov  1 10:03:47 2010
> @@ -199,7 +199,7 @@
>   private:
>     /// \brief The name of the file that was included, as written in
>     /// the source.
> -    std::string FileName;
> +    llvm::StringRef FileName;
> 
>     /// \brief Whether the file name was in quotation marks; otherwise, it was
>     /// in angle brackets.
> @@ -214,11 +214,9 @@
>     const FileEntry *File;
> 
>   public:
> -    explicit InclusionDirective(InclusionKind Kind,
> -                                const std::string &FileName, bool InQuotes,
> -                                const FileEntry *File, SourceRange Range)
> -      : PreprocessingDirective(InclusionDirectiveKind, Range), 
> -        FileName(FileName), InQuotes(InQuotes), Kind(Kind), File(File) { }
> +    InclusionDirective(PreprocessingRecord &PPRec,
> +                       InclusionKind Kind, llvm::StringRef FileName, 
> +                       bool InQuotes, const FileEntry *File, SourceRange Range);
> 
>     /// \brief Determine what kind of inclusion directive this is.
>     InclusionKind getKind() const { return static_cast<InclusionKind>(Kind); }
> 
> Modified: cfe/trunk/lib/Lex/PreprocessingRecord.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PreprocessingRecord.cpp?rev=117912&r1=117911&r2=117912&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Lex/PreprocessingRecord.cpp (original)
> +++ cfe/trunk/lib/Lex/PreprocessingRecord.cpp Mon Nov  1 10:03:47 2010
> @@ -21,6 +21,22 @@
> 
> ExternalPreprocessingRecordSource::~ExternalPreprocessingRecordSource() { }
> 
> +
> +InclusionDirective::InclusionDirective(PreprocessingRecord &PPRec,
> +                                       InclusionKind Kind, 
> +                                       llvm::StringRef FileName, 
> +                                       bool InQuotes, const FileEntry *File, 
> +                                       SourceRange Range)
> +  : PreprocessingDirective(InclusionDirectiveKind, Range), 
> +    InQuotes(InQuotes), Kind(Kind), File(File) 
> +{ 
> +  char *Memory 
> +    = (char*)PPRec.Allocate(FileName.size() + 1, llvm::alignOf<char>());
> +  memcpy(Memory, FileName.data(), FileName.size());
> +  Memory[FileName.size()] = 0;
> +  this->FileName = llvm::StringRef(Memory, FileName.size());
> +}
> +
> void PreprocessingRecord::MaybeLoadPreallocatedEntities() const {
>   if (!ExternalSource || LoadedPreallocatedEntities)
>     return;
> @@ -160,7 +176,7 @@
>   }
> 
>   clang::InclusionDirective *ID
> -    = new (*this) clang::InclusionDirective(Kind, FileName, !IsAngled, File, 
> -                                            SourceRange(HashLoc, EndLoc));
> +    = new (*this) clang::InclusionDirective(*this, Kind, FileName, !IsAngled, 
> +                                            File, SourceRange(HashLoc, EndLoc));
>   PreprocessedEntities.push_back(ID);
> }
> 
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=117912&r1=117911&r2=117912&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Mon Nov  1 10:03:47 2010
> @@ -1555,7 +1555,7 @@
>       InclusionDirective::InclusionKind Kind
>         = static_cast<InclusionDirective::InclusionKind>(Record[5]);
>       InclusionDirective *ID
> -        = new (PPRec) InclusionDirective(Kind,
> +        = new (PPRec) InclusionDirective(PPRec, Kind,
>                              llvm::StringRef(BlobStart, Record[3]),
>                                          Record[4],
>                                          File,
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list