r260831 - Fix a leak in the generated code for attributes with strings.

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Sat Feb 13 10:29:44 PST 2016


On Sat, Feb 13, 2016 at 1:11 PM, Benjamin Kramer via cfe-commits
<cfe-commits at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list