[cfe-dev] handle __attribute__((deprecated))
Nuno Lopes
nunoplopes at sapo.pt
Fri Mar 7 10:23:04 PST 2008
Hi,
So I've tried to fullfill all comments. Additionally I also provide a test
for most corner-cases.
The C++ part is still not handled, but it should be much easier now.
Nuno
----- Original Message -----
From: "Ted Kremenek" <kremenek at apple.com>
To: "Nuno Lopes" <nunoplopes at sapo.pt>
Cc: "cfe-dev" <cfe-dev at cs.uiuc.edu>
Sent: Monday, March 03, 2008 5:47 PM
Subject: Re: [cfe-dev] handle __attribute__((deprecated))
>
> On Mar 1, 2008, at 12:28 AM, Chris Lattner wrote:
>
>> Should this emit a diagnostic if it's not a function? Ted, can you
>> please review the rest of the 'HandleFormatAttribute' method?
>
> Hi Nuno,
>
> I've reviewed the version of HandleFormatAttribute that Chris
> committed to the clang tree from your latest patch. Thanks again for
> submitting this patch. It's a great contribution. I have a few
> comments:
>
>
> // FIXME: in C++ the implicit 'this' function parameter also counts.
> // the index must start in 1 and the limit is numargs+1
> unsigned NumArgs = Fn->getNumParams()+1; // +1 for ...
>
>
> This looks incorrect for all code except non-static C++ methods, of
> which we do not currently handle. The code after this frequently
> checks against NumArgs, which will be incorrect (off-by-one). Also,
> I'm not certain how we are actually going to handle declarations for
> class members, but chances are we are not going to use FunctionDecls.
> I would just remove the increment for now, and leave the FIXME. When
> I first looked at this code I was also a little confused; I thought
> you were trying to offset for a deficiency in the AST, rather than the
> fact that this is a game that the format attribute plays in GCC (i.e.,
> offsetting for the implicit "this" pointer):
>
> "Since non-static C++ methods have an implicit this argument, the
> arguments of such methods should be counted from two, not one..."
>
> Make a comment that this is is mirroring GCC behavior when it comes to
> C++ non-static methods and the format attribute. It also seems that
> offsets to the base index would have to be handled as well. I would
> just punt on this for now until we have Decls for C++ methods in
> place. I'm a little concerned about doing this right for C++ non-
> static methods; having little fudges like these to indices and ranges
> is a great source for off-by-one and buffer overflow errors if not all
> of the code obeys the rule. This behavior just seems like a GCC
> kludge, with the ASTs being tied to closely to the implementation of
> how methods are code generated (thus forcing the attribute
> specification itself to be broken); in reality, the "this" pointer
> would never be used as a format string, so we probably should just
> pretend that it isn't there when processing the format argument
> indices. This means that in the code below your original increment of
> NumArgs that we should instead *decrement* the parsed indices when
> handling C++ non-static methods. That way, the FormatAttr object
> always stores the canonicalized indices for the *explicit* function
> arguments (again, ignoring the "this" argument).
>
> More comments:
>
> Expr *IdxExpr = static_cast<Expr *>(rawAttr->getArg(0));
> llvm::APSInt Idx(32);
> if (!IdxExpr->isIntegerConstantExpr(Idx, Context)) {
> Diag(rawAttr->getLoc(), diag::err_attribute_argument_n_not_int,
> "format", std::string("2"), IdxExpr->getSourceRange());
> return;
> }
>
>
> Please do not hardcode "32" or the signedness of Idx, both which could
> be target specific. Please query these using
> Context::getTypeSize(IdxExpr) and IdxExpr->getType()-
> isUnsignedIntegerType().
>
> For the following block, please add a big comment indicating what it
> is trying to do:
>
>
> Expr *IdxExpr = static_cast<Expr *>(rawAttr->getArg(0));
> llvm::APSInt Idx(32);
> if (!IdxExpr->isIntegerConstantExpr(Idx, Context)) {
> Diag(rawAttr->getLoc(), diag::err_attribute_argument_n_not_int,
> "format", std::string("2"), IdxExpr->getSourceRange());
> return;
> }
>
> if (Idx.getZExtValue() < 1 || Idx.getZExtValue() > NumArgs) {
> Diag(rawAttr->getLoc(), diag::err_attribute_argument_out_of_bounds,
> "format", std::string("2"), IdxExpr->getSourceRange());
> return;
> }
>
> Expr *FirstArgExpr = static_cast<Expr *>(rawAttr->getArg(1));
> llvm::APSInt FirstArg(32);
> if (!FirstArgExpr->isIntegerConstantExpr(FirstArg, Context)) {
> Diag(rawAttr->getLoc(), diag::err_attribute_argument_n_not_int,
> "format", std::string("3"), FirstArgExpr->getSourceRange());
> return;
> }
>
> if (FormatLen == 8 && !memcmp(Format, "strftime", 8)) {
> if (FirstArg.getZExtValue() != 0) {
> Diag(rawAttr->getLoc(),
> diag::err_format_strftime_third_parameter,
> FirstArgExpr->getSourceRange());
> return;
> }
> } else if (FirstArg.getZExtValue() > NumArgs) {
> Diag(rawAttr->getLoc(), diag::err_attribute_argument_out_of_bounds,
> "format", std::string("3"), FirstArgExpr->getSourceRange());
> return;
> }
>
>
> As far as comments are concerned, it would be great to see a citation
> link to the appropriate references. For example, the following link
> provides GCC's documentation on format argument attributes:
>
>
> http://gcc.gnu.org/onlinedocs/gcc-4.2.3/gcc/Function-Attributes.html#index-g_t_0040code_007bformat_007d-function-attribute-1880
>
> Adding this link in a comment would be helpful so that people know
> what this code is trying to implement. This mirrors documentation
> through the rest of clang where we try to cite either the C standard
> or the appropriate reference. Also, please add comments above
> checks like "if (FirstArg.getZExtValue() != 0)" where the argument is
> not suppose to be zero and *why*.
>
> There is no harm in adding comments that document behavior; for
> example, before seeing this code I did not know that the format
> attribute supported the __strftime__ and __strfmon__ archetypes. I
> don't think GCC always supported these archetypes, so adding some
> comments saying what functionality this adds to the format attribute
> would be incredibly useful to other people browsing this code (which
> is one of the goals of clang).
>
> Overall, this patch looks very good, and like your previous patches,
> it's a great contribution to clang.
>
> Ted
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: clang_format_attr.txt
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20080307/450d00ed/attachment.txt>
More information about the cfe-dev
mailing list