Petit piège

J’ai corrigé un (vieux) bug hier, introduit dans le code il y a plus de 11 ans, modifié plusieurs fois depuis jusqu’à récemment (2018 de mémoire) et pour lequel on s’est fait avoir par la gestion soft du typage (et du cast) des données.

On avait quelque chose comme ça :

public function getURLFor($type, $value = '')
{
    $core = &$GLOBALS['core'];
    $url  = $core->callBehavior('publicGetURLFor', $type, $value);
    if (!$url) {
        $url = $this->getBase($type);
        if ($value) {
            if ($url) {
                $url .= '/';
            }
            $url .= $value;
        }
    }

    return $url;
}

Et une fois corrigé ça donne ceci :

public function getURLFor($type, $value = '')
{
    $core = &$GLOBALS['core'];
    $url  = $core->callBehavior('publicGetURLFor', $type, $value);
    if (!$url) {
        $url = $this->getBase($type);
        if ($value !== '') {
            if ($url) {
                $url .= '/';
            }
            $url .= $value;
        }
    }

    return $url;
}

Le bug se trouvait à la ligne 7, soit if ($value) { qui pose problème si, par exemple, $value est égal à '0' (chaîne de caractère contenant le chiffre 0), parce que tester if ('0') { sera interprété par PHP comme if (false). Or la chaîne '0' est tout à fait valide et doit être prise en compte, ce qui est fait correctement avec if ($value !== '') { !

Voilà le piège de la conversion de valeur en PHP, spécialement avec les chaînes contenant '0' !

D’ailleurs je pense que cette fonction et probablement plein d’autres, gagneraient à bénéficier du typage des arguments et des retours, dans la mesure du possible, parce que ça simplifie le code sous-jacent vu que les types sont connus d’emblée ; on a parfois juste à jongler entre pas de valeur (null) et une valeur d’un type précis.

PS : Va falloir que je retouche légèrement le style du code en ligne (dans le corps du texte), ça fait un peu pâté quand il y en a beaucoup, vous ne trouvez pas ?

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/15298

Haut de page