[cfe-dev] Checking For The Overflow Of An Expr In A ASTMatcher

Daniel Marjamäki via cfe-dev cfe-dev at lists.llvm.org
Mon Jan 9 03:59:39 PST 2017


I don't know why you get 0xFFFFFFFF from getExtValue(). I get 0.

    B->dump();

    llvm::APSInt Result;
    B->EvaluateAsInt(Result, AC->getASTContext());
    Result.dump();

    llvm::APSInt LVal;
    B->getLHS()->EvaluateAsInt(LVal, AC->getASTContext());

    __int64 x = Result.getExtValue();  // <- x=0
    bool y = Result < LVal; // <- y=true


Best regards,
Daniel Marjamäki

..................................................................................................................
Daniel Marjamäki Senior Engineer
Evidente ES East AB  Warfvinges väg 34  SE-112 51 Stockholm  Sweden

Mobile:                 +46 (0)709 12 42 62
E-mail:                 Daniel.Marjamaki at evidente.se

www.evidente.se

________________________________________
From: Farzad Sadeghi [thabogre at gmail.com]
Sent: 09 January 2017 12:09
To: Daniel Marjamäki
Cc: cfe-dev
Subject: Re: [cfe-dev] Checking For The Overflow Of An Expr In A ASTMatcher

My dump also shows the same thing:
ParenExpr 0x30debe0 'unsigned int'
`-BinaryOperator 0x30debb8 'unsigned int' '+'
  |-IntegerLiteral 0x30deb78 'unsigned int' 2147483648
  `-IntegerLiteral 0x30deb98 'unsigned int' 2147483648
APInt(32b, 0u 0s)

but when i use getExtValue() it returns 0xFFFFFFFF which is not a wrap-around.
maybe i shouldnt get the value like that?

On 1/9/17, Daniel Marjamäki <Daniel.Marjamaki at evidente.se> wrote:
>
> Hello!
>
> It sounds strange that you get a saturated value.
>
> try this code:
>
>     B->dump();
>
>     llvm::APSInt Result;
>     B->EvaluateAsInt(Result, AC->getASTContext());
>     Result.dump();
>
> My output is:
>
>     BinaryOperator 0x651b98 'unsigned int' '+'
>     |-IntegerLiteral 0x651b58 'unsigned int' 2147483648
>     `-IntegerLiteral 0x651b78 'unsigned int' 2147483648
>
>     APInt(32b, 0u 0s)
>
> Here it can be seen that there has been an overflow since the result is less
> than the operands.
>
> Best regards,
> Daniel Marjamäki
>
> ..................................................................................................................
> Daniel Marjamäki Senior Engineer
> Evidente ES East AB  Warfvinges väg 34  SE-112 51 Stockholm  Sweden
>
> Mobile:                 +46 (0)709 12 42 62
> E-mail:                 Daniel.Marjamaki at evidente.se
>
> www.evidente.se
>
> ________________________________________
> From: cfe-dev [cfe-dev-bounces at lists.llvm.org] on behalf of Farzad Sadeghi
> via cfe-dev [cfe-dev at lists.llvm.org]
> Sent: 09 January 2017 09:13
> To: cfe-dev
> Subject: [cfe-dev] Checking For The Overflow Of An Expr In A ASTMatcher
>
> Hi,
> I have two questions.
> I wan to check for overflows in an ASTMatcher.
> I only need to check for Exprs that are of type Int, so I figured I
> could use Expr::EvaluateAsInt.
> I have the following code:
>
> #define START 0x80000000
> #define END 0xFFFFFFFF
> #define LEN 0x80000000
>
> if ((START + LEN) > END)
> {
>    /*does something*/
> }
>
> Int size on my target(x86-64) is 32-bits so obviously START + LEN
> should overflow.
> when i call the APSInt.getExtValue() I get 4294967295 which has
> overflowed and saturated. The type of the Expr is Int so the result is
> saturated and then when i extend it with getExtValue its not going to
> give me 4294967296 obviously.
> My question is, is there a way to cast the result of the evaluation to
> a wider type before it gets truncated?
>
> I also thought i could use Expr::EvaluateForOverflow( const
> ASTContext) but i cant figure out how it works.  My question is How
> does it return a value I can check for?
> The return type is void so i figured maybe its setting a flag
> somewhere but I couldnt find it. I looked at Expr's attributes but no
> luck. I thought maybe ASTContext holds the result but I couldn't find
> anything there either.
>
> --
> Farzad Sadeghi
> project mutator-https://github.com/bloodstalker/mutator
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>


--
Farzad Sadeghi
project mutator-https://github.com/bloodstalker/mutator



More information about the cfe-dev mailing list