Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Competition: deceptive code

by sfink (Deacon)
on Jan 12, 2008 at 07:38 UTC ( #662040=perlmeditation: print w/ replies, xml ) Need Help??

I'm normally not a huge fan of either golf or obfu, but another node recently got me thinking -- it would be fun to have a contest to come up with the best example of code that appears to do one thing but actually does another. We've all written such code accidentally, I'm sure, but I'm wondering how far a crazy person could take it.

I just thought of this, and really ought to come up with some better examples. But to at least illustrate what I'm talking about, consider:

if (undef($a) || undef($b)) { ... }
and then there's the ever popular
if ($a = 1) { ... }
and one of my private bugbears is
my ($key, $value) = s/(\w+)=(.*)/$1: $2/;
although the actual result isn't terribly interesting in that case, so I'm not sure it counts.

Far more common is $string = /\s+$//, which is closely akin to @x = map { s/\#.*// } @lines.

Then there are the complex things like:

for my $splort (foo()) { do { chop($splort); last if $splort eq $root; } until (happy($splort)); print "happy or root\n"; }

Anyway, rather than continue with poor examples, I want to propose a competition: come up with a smallish chunk of code that appears to do one thing but actually does quite another. The apparent behavior should be something vaguely sensible (as in, it appears to perform some operation that somebody might actually want to perform in real code), and you get bonus points if the actual behavior is nontrivial and sensible as well. Or if the "erroneous" (but actual) behavior propagates to further confuse matters. Or if multiple deceptive statements cancel each other out, fully or partially. (So you get the right answer for the wrong reasons.) Slight demerits if use warnings or use strict would have caught your "mistake".

For example, if the actual behavior is crashing with an exception, no bonus points for you. Bonus points if the actual behavior is to advance a hash iterator so that a later line doesn't see the entry that would have completed the computation of $count, except that $count is computed incorrectly anyway so it ends up being correct but only because the hash iterator got fouled up.

In a way, this competition is about interesting bugs that were hell to track down, except that I'm asking you to intentionally manufacture the bugs.

Comment on Competition: deceptive code
Select or Download Code
Re: Competition: deceptive code
by ambrus (Abbot) on Jan 12, 2008 at 11:11 UTC
Re: Competition: deceptive code
by FunkyMonk (Canon) on Jan 12, 2008 at 13:58 UTC
Re: Competition: deceptive code
by eyepopslikeamosquito (Canon) on Jan 12, 2008 at 21:37 UTC

    But to at least illustrate what I'm talking about, consider:
    if (undef($a) || undef($b)) { ... }
    and then there's the ever popular
    if ($a = 1) { ... }
    I'd put these two in the category of "Common Goofs for Novices". The Camel Book has a section dedicated to this. So, in addition to your competition, I'd be interested in seeing a list of common Perl goofs. I've certainly seen plenty over the years, since we have a lot of "occasional" Perl programmers at work. Some random ones that I remember seeing often at work are:
    • @x[42] instead of $x[42].
    • print FH, "hello\n";
    • /$name/ where $name might contain regex metachars (should use /\Q$name\E/ instead).
    • /some regex/; $x = $1 .... That is, using $1 et al without checking that the regex actually matched.

    Related to this is a WTF-style competition. I noticed an amusing one reported by Dominus the other day, namely what is wrong with this code?

    for my $k (keys %hash) { if ($k eq "name") { $hash{$k}++; } }
    Answer: it is better written as $hash{name}++ ... which is an example of the classic Larry quote: Iterating over the keys of a hash is like clubbing someone to death with a loaded Uzi. :-)

      The Camel Book has a section dedicated to this.

      You mean perltrap?

        You mean perltrap?
        At the time, I was referring to the section entitled "Common Goofs for Novices" in Chapter 24 (page 585) of Programming Perl, 3rd edition. Though I knew about perltrap, I temporarily "forgot" about it and so did not mention it. :-( Since the "Common Goofs for Novices" section and perltrap share a common heritage, perltrap is a more up-to-date reference and is recommended reading. Thanks for pointing this out.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlmeditation [id://662040]
Approved by Corion
Front-paged by citromatik
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (13)
As of 2014-10-30 16:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (208 votes), past polls