Christian Seiler: Verhalten von PHP-Funktionen abhängig vom Compiler?

Beitrag lesen

Hallo Tom,

In einer Crypt Funktion, die mit shift_left arbeitet, treten angeblich unterschiedliche Ergebnisse auf, je nachdem, ob PHP mit gcc 3.3 oder mit einer neueren Version compiliert wurde.

Kann das jemand nachvollziehen?

"I have the similar problem, the reason was in PHP that was builded with gcc 3.4. When arithmetic overflow occurs PHP sets number value in 2^32 instead cutting highest bit...we build php with gcc 3.3 and all works fine"

Naja, der Text sagt es doch schon: Wenn ein Überlauf auftritt, dann reagiert PHP anders. Die Frage ist halt: Wann tritt ein Überlauf auf?

[Viel Code]
Wenn mich nicht alles täuscht, ist das ein MD-5 crypt-Algorythmus

Naja, das sieht nicht nach MD5 aus, aber es ist definitiv eine Form von Hash-Algorithmus.

Übrigens: Du hast vergessen, die CRYPT_MAGIC-Konstante zu posten, so ist der Code relativ nutzlos.

Zudem: Ohne Dir zu nahe tretenzu wollen, die Funktion ist doch irgendwie Käse, oder? Wenn $url ein String ist (was der Name der Funktion nahe legt), dann wird $url[2] bei 'http://www.heise.de/' (als Beispiel) zum Zeichen 't' ausgewertet, was dann - wenn's in einen Integer verwandelt wird - 0 ergibt. Und sizeof() ist bei Strings auch nicht extrem nützlich. Und einer Funktion, die crypt_url() heißt einen Hash von Bytewerten zu übergeben ist doch auch seltsam...?

Server 1 PHP 4.3.3 läuft nicht
Server 2 PHP 4.4.0 läuft wunschgemäß

Urgs. Das ist nicht Dein Ernst? PHP 4.4.0? 4.3.3? Sicherheit, anyone? Aktuellste PHP-Version der 4er-Reihe ist 4.4.7. Alle Versionen davor ist Selbstmord und selbst 4.4.7 ist sicherheitstechnisch bedenklich (zumindest ohne zusätzliche Patches, weil die PHP-Leute z.B. Reference Counting Overflows partout nicht fixen wollen, die meisten Distros bieten selbstgepatchte Versionen an, vgl. http://news.php.net/php.internals/29582).

Und naja, ansonsten: Was heißt "läuft nicht" vs. "läuft wunschgemäß"?

Wofür willst Du den Kram überhaupt einsetzen? Warum sind Dir die vorgefertigen Hashfunktionen, die PHP bietet (md5, sha1, crc32, ...) nicht ausreichend?

Wie kann man feststellen, mit welcher GCC-Vewrison PHP compiliert wurde?

Noch gar nicht. Aktuell wird auf der Mailingliste diskutiert, dass diese Information in Zukunft gespeichert wird: http://news.php.net/php.internals/33168 Kommt also frühestens 5.2.6.

Viele Grüße,
Christian