[Soot-list] [McLab] Fwd: Re: Question about McSAF merge
Laurie Hendren
hendren at cs.mcgill.ca
Tue May 7 17:33:06 EDT 2013
My question also ...
Laurie
+--------------------------------------------------------------
| Laurie Hendren --- http://www.sable.mcgill.ca/~hendren
| Associate Dean (Academic), Faculty of Science
| Professor, School of Computer Science, McGill University
| New McLAB project: http://www.sable.mcgill.ca/mclab/
| Also: www.sable.mcgill.ca/soot www.sable.mcgill.ca/abc
+--------------------------------------------------------------
On 07/05/2013 5:21 PM, Ismail Badawi wrote:
> I don't understand how polymorphism enters into it. Can you explain?
>
> Thanks,
> Ismail
>
>
> On Tue, May 7, 2013 at 4:27 PM, Almo <aaloanmiftah at yahoo.com
> <mailto:aaloanmiftah at yahoo.com>> wrote:
>
> Hey,
>
> It's because of polymorphism.
>
> Aaloan
>
> ------------------------------------------------------------------------
> *From:* Prof. Laurie HENDREN <hendren at cs.mcgill.ca
> <mailto:hendren at cs.mcgill.ca>>
> *To:* Soot-list <soot-list at sable.mcgill.ca
> <mailto:soot-list at sable.mcgill.ca>>; mclab <mclab at sable.mcgill.ca
> <mailto:mclab at sable.mcgill.ca>>
> *Sent:* Tuesday, May 7, 2013 2:21 PM
> *Subject:* [Soot-list] Fwd: Re: [McLab] Question about McSAF merge
>
> Hi Sooters,
>
> The e-mail thread below questions the API for merge in McSAF. I
> think McSAF inherited the API from Soot, so I would like to know
> the Soot folks take on this. I know we won't want to change
> Soot now, but McLab is new enough that we can still make changes.
>
> Cheers, Laurie
>
>
>
> -------- Original Message --------
> Subject: Re: [McLab] Question about McSAF merge
> Date: Tue, 7 May 2013 15:06:37 -0400
> From: Matthieu Dubet <maattdd at gmail.com> <mailto:maattdd at gmail.com>
> To: Ismail Badawi <isbadawi at gmail.com> <mailto:isbadawi at gmail.com>
> CC: mclab <mclab at sable.mcgill.ca> <mailto:mclab at sable.mcgill.ca>
>
>
>
> As you said the only reason I can think of to do that is to avoid
> the allocation in the merge function
> (http://stackoverflow.com/questions/10403766/passing-a-parameter-versus-returning-it-from-function).
>
>
> It is clearly negligeable in 99.9 .. % of the case (especially
> considering the size of flowsets), but it creates a confusion for
> the user ("what is happening to the "out" parameter if it's not an
> empty set ??? " ..etc..) .Â
>
> It is a bad design choice imho.
>
> However, the original author might have been influenced by a wrong
> C++ idiom where returning collections as value was considered bad
> for performances so people were passing the output value as input
> ¶meter. But it's not true anyway because of :Â
> * C++11 move semantic
> * automatic return-value-optimization from most compilers before C++11
> * anyway not applicable to Java because of the reference only
> semantic.
>
>
> On Tue, May 7, 2013 at 2:00 PM, Ismail Badawi <isbadawi at gmail.com
> <mailto:isbadawi at gmail.com>> wrote:
>
> Hi,
>
> I was wondering if someone knows why (or can try and justify
> why) McSAF analyses have to implement
>
> void merge(A in1, A in2, A out)
>
> instead of
>
> A merge(A in1, A in2)
>
> The first form is error-prone because you don't know what out
> is -- e.g. if A = Set<String> and you want to do union, it
> might not be the empty set so you should clear it first. But
> it seems merge is often called with out pointing to the same
> thing as in1 or in2, so you end up having to consider a bunch
> of cases (all three sets the same, all three sets different,
> in1 same as out, in2 same as out, etc.) otherwise you risk
> writing over the inputs.
>
> For example, if you wanted to merge sets using union, naively
> you would write
>
> public void merge(Set<String> in1, Set<String> in2,
> Set<String> out) {
> Â out.clear();
> Â out.addAll(in1);
> Â out.addAll(in2);
> }
>
> but actually you should write
>
> public void merge(Set<String> in1, Set<String> in2,
> Set<String> out) {
> Â if (in1 != out && in2 != out) {
> Â Â out.clear();
> Â }
> Â if (in1 != out) {
> Â Â out.addAll(in1);
> Â }
> Â if (in2 != out) {
> Â Â out.addAll(in2);
> Â }
> }
>
> which seems needlessly convoluted. I guess I could fix the
> framework to always pass in a newInitialFlow() or something
> but why not leave it up the implementing class? You could write
>
> public Set<String> merge(Set<String> in1, Set<String> in2) {
> Â Set<String> out = new HashSet<String>();
> Â out.addAll(in1);
> Â out.addAll(in2);
> Â return out;
> }
>
> which is more obviously correct.
>
> I guess maybe it's to avoid a memory allocation? But is it
> worth the trouble?
>
> Ismail
>
>
>
>
>
>
> _______________________________________________
> Soot-list mailing list
> Soot-list at sable.mcgill.ca <mailto:Soot-list at sable.mcgill.ca>
> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
>
>
>
> _______________________________________________
> McLab mailing list
> McLab at sable.mcgill.ca <mailto:McLab at sable.mcgill.ca>
> http://mailman.cs.mcgill.ca/mailman/listinfo/mclab
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.cs.mcgill.ca/pipermail/soot-list/attachments/20130507/5c31b535/attachment-0001.html
More information about the Soot-list
mailing list