Just when everything was making sense

January 20th, 2010

Okay, let’s say you managed to ensure that your program doesn’t exhaust the heap with anonymous functions, and that you understand the edge cases involved in function-type variables. There are still lots of ways for create_function to bite you in the glutes.

Read the rest of this entry »

Did you think I wouldn’t recognize this compromise

January 16th, 2010

On Thursday, commenter Grumqa asked how PHP deals with the slow accumulation of functions if you call create_function.

It doesn’t.

Read the rest of this entry »

My purity you stole

January 14th, 2010

Yesterday, I wrote about how $f() variable-function syntax works in PHP. While it is pretty bad, it’s also the groundwork for understanding the ways in which create_function is terrible.

No, I mean besides taking a string full of code as one of its arguments.

Read the rest of this entry »

Carry out my sentence

January 13th, 2010

Early on in PHP’s life, its type system contained only strings, ints, reals, arrays, “resources,” and null. A number of features have been bodged in on top of this minimal system without really extending it. “Function pointer” functionality was one of the first.

Read the rest of this entry »

I decided I was never coming down

January 12th, 2010

I’m still sick, so you get another easy target today. It’s trivially easy to kill the PHP interpreter, dead, without invoking any extensions or unusual language features:

1
2
3
4
5
6
7
8
9
< ?php
function recurse($n) {
    if ($n <= 0)
        return;
    return recurse($n - 1);
}
 
recurse(100000); /* You may need to adjust this upwards. */
?>

Read the rest of this entry »

I really don’t know what you mean

January 11th, 2010

It’s Monday, and I’m sick, so you get some low-hanging fruit today. The following snippet produces a syntax error in PHP:

1
2
3
4
5
6
7
< ?php
function monolithic_dimensions() {
    return array(1, 4, 9);
}
 
print monolithic_dimensions()[0]; // syntax error, unexpected '['
?>

Read the rest of this entry »

Let’s go dancing on the backs of the bruised

January 10th, 2010

Remember the C++ idiom I mentioned yesterday? In PHP, it has some unique gotchas.

Read the rest of this entry »

I’d rather die than give you control

January 9th, 2010

Most modern languages have a construct that allows code to run at the end of a block regardless of how flow leaves a block. This allows code to reliably close resources, perform rollbacks, and otherwise maintain invariants relatively easily, even in the presence of exceptions.

Read the rest of this entry »

God Money, I’ll do anything for you

January 8th, 2010

The loop

1
2
3
4
5
< ?php
while ($read < $n && (false !== ($buf = fread($this->sock, $n - $read)))) {
    /* ... */
}
?>

contains a subtle bug. Go ahead, read the relevant function documentation and see if you can spot it.

Read the rest of this entry »