-analyzer-inline-max-stack-depth?

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

-analyzer-inline-max-stack-depth?

suyash singh via cfe-dev

Hello,

 

I am trying to add tests to Iterator Modeling where std::advance(), std::prev() and std::next() are used. These latter two use the former one, which in some implementations uses __advance(). In real scenarios it happens that std::prev() or next() or std::advance() called by them or __advance() called by that one is not inlined. I would like to test these scenarios explicitly. My idea is to limit the inline stack by using -analyzer-inline-max-stack-depth, but any value I use the result is the same: everything is inlined, even __advance(). Do I misunderstand this flag, or it does not work at all?

 

Regards,

 

Ádám

 


_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: -analyzer-inline-max-stack-depth?

suyash singh via cfe-dev
We already have such tests and they're working as expected.

I think your problem must be that some functions are inlined regardless
of that limit, eg. the ones with trivial (linear) CFG. If that's the
case, you'll also have to figure out why aren't they inlined in the real
world for the same reason.

On 2/25/20 5:03 PM, Ádám Balogh via cfe-dev wrote:

>
> Hello,
>
> I am trying to add tests to Iterator Modeling where std::advance(),
> std::prev() and std::next() are used. These latter two use the former
> one, which in some implementations uses __advance(). In real scenarios
> it happens that std::prev() or next() or std::advance() called by them
> or __advance() called by that one is not inlined. I would like to test
> these scenarios explicitly. My idea is to limit the inline stack by
> using -analyzer-inline-max-stack-depth, but any value I use the result
> is the same: everything is inlined, even __advance(). Do I
> misunderstand this flag, or it does not work at all?
>
> Regards,
>
> Ádám
>
>
> _______________________________________________
> cfe-dev mailing list
> [hidden email]
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev

_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: -analyzer-inline-max-stack-depth?

suyash singh via cfe-dev
Hello!

Yes, I saw such tests. My functions are trivial (linear) indeed, but they have basically the same implementation in the real headers as well, and in many cases std::prev(Something.end()) becomes Something.end() causing false positives. When I started investigating this problem, it turned out that in some cases std::prev() is not inlined at all, in some other cases std::prev() is inlined but std::advance() called by it is not and there were cases when both were inlined but __advance() called by std::advance() was not. I just saw the exploded graph. When I implemented modeling of these functions for the non-inlined case the false positives were gone.

I have no idea why some of these functions in some cases were not inlined. Maybe budget ran out? How to test it explicitly?

Regards,

Ádám

-----Original Message-----
From: Artem Dergachev <[hidden email]>
Sent: 2020. február 25., kedd 16:44
To: Ádám Balogh <[hidden email]>; '[hidden email]' <[hidden email]>
Subject: Re: [cfe-dev] -analyzer-inline-max-stack-depth?

We already have such tests and they're working as expected.

I think your problem must be that some functions are inlined regardless of that limit, eg. the ones with trivial (linear) CFG. If that's the case, you'll also have to figure out why aren't they inlined in the real world for the same reason.

On 2/25/20 5:03 PM, Ádám Balogh via cfe-dev wrote:

>
> Hello,
>
> I am trying to add tests to Iterator Modeling where std::advance(),
> std::prev() and std::next() are used. These latter two use the former
> one, which in some implementations uses __advance(). In real scenarios
> it happens that std::prev() or next() or std::advance() called by them
> or __advance() called by that one is not inlined. I would like to test
> these scenarios explicitly. My idea is to limit the inline stack by
> using -analyzer-inline-max-stack-depth, but any value I use the result
> is the same: everything is inlined, even __advance(). Do I
> misunderstand this flag, or it does not work at all?
>
> Regards,
>
> Ádám
>
>
> _______________________________________________
> cfe-dev mailing list
> [hidden email]
> https://protect2.fireeye.com/v1/url?k=3fb556f9-633f834d-3fb51662-866a0
> 15dd3d5-59556715899d041c&q=1&e=a9ffe848-0c9e-4f51-aa73-0dd881bdb9db&u=
> https%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fcfe-dev

_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: -analyzer-inline-max-stack-depth?

suyash singh via cfe-dev
I usually debug why something's inlined or not by step-by-step-debugging
ExprEngine::defaultEvalCall().

As usual, you can make conditional breakpoints with condition`Pred->Id
== ...` assuming you've already located the offending node in the
ExplodedGraph dump or via debug prints.

On 2/26/20 3:37 PM, Ádám Balogh via cfe-dev wrote:

> Hello!
>
> Yes, I saw such tests. My functions are trivial (linear) indeed, but they have basically the same implementation in the real headers as well, and in many cases std::prev(Something.end()) becomes Something.end() causing false positives. When I started investigating this problem, it turned out that in some cases std::prev() is not inlined at all, in some other cases std::prev() is inlined but std::advance() called by it is not and there were cases when both were inlined but __advance() called by std::advance() was not. I just saw the exploded graph. When I implemented modeling of these functions for the non-inlined case the false positives were gone.
>
> I have no idea why some of these functions in some cases were not inlined. Maybe budget ran out? How to test it explicitly?
>
> Regards,
>
> Ádám
>
> -----Original Message-----
> From: Artem Dergachev <[hidden email]>
> Sent: 2020. február 25., kedd 16:44
> To: Ádám Balogh <[hidden email]>; '[hidden email]' <[hidden email]>
> Subject: Re: [cfe-dev] -analyzer-inline-max-stack-depth?
>
> We already have such tests and they're working as expected.
>
> I think your problem must be that some functions are inlined regardless of that limit, eg. the ones with trivial (linear) CFG. If that's the case, you'll also have to figure out why aren't they inlined in the real world for the same reason.
>
> On 2/25/20 5:03 PM, Ádám Balogh via cfe-dev wrote:
>> Hello,
>>
>> I am trying to add tests to Iterator Modeling where std::advance(),
>> std::prev() and std::next() are used. These latter two use the former
>> one, which in some implementations uses __advance(). In real scenarios
>> it happens that std::prev() or next() or std::advance() called by them
>> or __advance() called by that one is not inlined. I would like to test
>> these scenarios explicitly. My idea is to limit the inline stack by
>> using -analyzer-inline-max-stack-depth, but any value I use the result
>> is the same: everything is inlined, even __advance(). Do I
>> misunderstand this flag, or it does not work at all?
>>
>> Regards,
>>
>> Ádám
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> [hidden email]
>> https://protect2.fireeye.com/v1/url?k=3fb556f9-633f834d-3fb51662-866a0
>> 15dd3d5-59556715899d041c&q=1&e=a9ffe848-0c9e-4f51-aa73-0dd881bdb9db&u=
>> https%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fcfe-dev
> _______________________________________________
> cfe-dev mailing list
> [hidden email]
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev

_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev