On Sat, Feb 13, 2016 at 1:11 PM, Benjamin Kramer via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: d0k > Date: Sat Feb 13 12:11:49 2016 > New Revision: 260831 > > URL: http://llvm.org/viewvc/llvm-project?rev=260831&view=rev > Log: > Fix a leak in the generated code for attributes with strings. > > Storing std::strings in attributes simply doesn't work, we never call > the destructor. Use an array of StringRefs instead of std::strings and > copy the data into memory taken from the ASTContext.
Good catch, thank you for this fix! ~Aaron > > Modified: > cfe/trunk/lib/Sema/SemaDeclAttr.cpp > cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp > > Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=260831&r1=260830&r2=260831&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Sat Feb 13 12:11:49 2016 > @@ -4952,7 +4952,7 @@ static void handleNoSanitizeAttr(Sema &S > if (!checkAttributeAtLeastNumArgs(S, Attr, 1)) > return; > > - std::vector<std::string> Sanitizers; > + std::vector<StringRef> Sanitizers; > > for (unsigned I = 0, E = Attr.getNumArgs(); I != E; ++I) { > StringRef SanitizerName; > @@ -4976,8 +4976,8 @@ static void handleNoSanitizeSpecificAttr > const AttributeList &Attr) { > StringRef AttrName = Attr.getName()->getName(); > normalizeName(AttrName); > - std::string SanitizerName = > - llvm::StringSwitch<std::string>(AttrName) > + StringRef SanitizerName = > + llvm::StringSwitch<StringRef>(AttrName) > .Case("no_address_safety_analysis", "address") > .Case("no_sanitize_address", "address") > .Case("no_sanitize_thread", "thread") > > Modified: cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp?rev=260831&r1=260830&r2=260831&view=diff > ============================================================================== > --- cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp (original) > +++ cfe/trunk/utils/TableGen/ClangAttrEmitter.cpp Sat Feb 13 12:11:49 2016 > @@ -81,7 +81,7 @@ static std::string ReadPCHRecord(StringR > .Case("TypeSourceInfo *", "GetTypeSourceInfo(F, Record, Idx)") > .Case("Expr *", "ReadExpr(F)") > .Case("IdentifierInfo *", "GetIdentifierInfo(F, Record, Idx)") > - .Case("std::string", "ReadString(Record, Idx)") > + .Case("StringRef", "ReadString(Record, Idx)") > .Default("Record[Idx++]"); > } > > @@ -95,7 +95,7 @@ static std::string WritePCHRecord(String > .Case("Expr *", "AddStmt(" + std::string(name) + ");\n") > .Case("IdentifierInfo *", > "AddIdentifierRef(" + std::string(name) + ", Record);\n") > - .Case("std::string", "AddString(" + std::string(name) + ", Record);\n") > + .Case("StringRef", "AddString(" + std::string(name) + ", Record);\n") > .Default("Record.push_back(" + std::string(name) + ");\n"); > } > > @@ -528,7 +528,9 @@ namespace { > : Argument(Arg, Attr), Type(T), ArgName(getLowerName().str() + "_"), > ArgSizeName(ArgName + "Size"), RangeName(getLowerName()) {} > > - std::string getType() const { return Type; } > + const std::string &getType() const { return Type; } > + const std::string &getArgName() const { return ArgName; } > + const std::string &getArgSizeName() const { return ArgSizeName; } > bool isVariadic() const override { return true; } > > void writeAccessors(raw_ostream &OS) const override { > @@ -993,8 +995,19 @@ namespace { > class VariadicStringArgument : public VariadicArgument { > public: > VariadicStringArgument(const Record &Arg, StringRef Attr) > - : VariadicArgument(Arg, Attr, "std::string") > + : VariadicArgument(Arg, Attr, "StringRef") > {} > + void writeCtorBody(raw_ostream &OS) const override { > + OS << " for (size_t I = 0, E = " << getArgSizeName() << "; I != > E;\n" > + " ++I) {\n" > + " StringRef Ref = " << getUpperName() << "[I];\n" > + " if (!Ref.empty()) {\n" > + " char *Mem = new (Ctx, 1) char[Ref.size()];\n" > + " std::memcpy(Mem, Ref.data(), Ref.size());\n" > + " " << getArgName() << "[I] = StringRef(Mem, > Ref.size());\n" > + " }\n" > + " }"; > + } > void writeValueImpl(raw_ostream &OS) const override { > OS << " OS << \"\\\"\" << Val << \"\\\"\";\n"; > } > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits