[cfe-dev] (no subject)

Jordan Rose jordan_rose at apple.com
Thu May 1 09:12:24 PDT 2014


The analyzer traffics in const Stmt * and const Expr * everywhere, so your temporary variable for #2 and #3 should be "const StringLiteral *SL" (or just "auto *SL" now that we're using C++11).

The probable reason why this doesn't work is because there's probably an ImplicitCastExpr wrapping the StringLiteral, handling the decay from char[N] to char* (or const char *, or whatever). Depending on what you want to do, you may want to use Expr::IgnoreParenImpCasts to "look through" these kinds of filters.

Jordan


On May 1, 2014, at 4:31 , Aitor San Juan <aitor.sj at opendeusto.es> wrote:

> Hello,
> 
> In a checker I want to test whether an argument to a function call is a String literal, but I'm a bit stuck. Could anybody shed a bit of light on this?
> 
> 1. This way seems to not work (although no compile-time error), but I don't understand why:
> 
> const Expr *arg = CE->getArg(0); // CE is a CallExpr
> if ((arg != NULL) && (clang::isa<clang::StringLiteral>(arg))){
> ...
> 
> 2. The following does not compile:
> 
> const Expr *arg = CE->getArg(0); // CE is a CallExpr
> if (StringLiteral *SL = dyn_cast<StringLiteral>(arg)) {
> 
> invalid conversion from ‘llvm::cast_retty<clang::StringLiteral, const clang::Expr*>::ret_type {aka const clang::StringLiteral*}’ to ‘clang::StringLiteral*’ [-fpermissive]
>     if (StringLiteral *SL = dyn_cast<StringLiteral>(arg)) {
>                                                                            ^
> 3. The following does not compile, however there's a non-const getArg() method:
> 
> Expr *arg = CE->getArg(0); // CE is a CallExpr
> if (StringLiteral *SL = dyn_cast<StringLiteral>(arg)) {
> 
> error: invalid conversion from ‘const clang::Expr*’ to ‘clang::Expr*’ [-fpermissive]
>     Expr *arg = CE->getArg(0);
>                             ^
> 
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev





More information about the cfe-dev mailing list