FFI::cast() from pointer returns new value instead of reference.
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- C
- Sterne
- 40.4k
- Forks
- 8.1k
- Ø Merge
- 2 T. 13 Std.
- Gemergte PRs (30 T.)
- 96
Beschreibung
Description
Hi!
I'm also not sure it's a bug, but documentation says: FFI::cast() creates a new FFI\CData object, that references the same C data structure, but is associated with a different type.
The following code:
<?php
$val = FFI::new('char[8]');
FFI::memcpy($val, implode('', range('a', 'h')), 8);
var_dump($val);
$firstInt = FFI::cast('int32_t', $val);
var_dump($firstInt);
$firstInt->cdata = 0;
var_dump($val);
$secondInt = FFI::cast('int32_t', $val + 4);
var_dump($secondInt);
$secondInt->cdata = 0;
var_dump($val);
Resulted in this output:
object(FFI\CData:char[8])#1 (8) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
[4]=>
string(1) "e"
[5]=>
string(1) "f"
[6]=>
string(1) "g"
[7]=>
string(1) "h"
}
object(FFI\CData:int32_t)#2 (1) {
["cdata"]=>
int(1684234849)
}
object(FFI\CData:char[8])#1 (8) {
[0]=>
string(1) ""
[1]=>
string(1) ""
[2]=>
string(1) ""
[3]=>
string(1) ""
[4]=>
string(1) "e"
[5]=>
string(1) "f"
[6]=>
string(1) "g"
[7]=>
string(1) "h"
}
object(FFI\CData:int32_t)#4 (1) {
["cdata"]=>
int(721424396)
}
object(FFI\CData:char[8])#1 (8) {
[0]=>
string(1) ""
[1]=>
string(1) ""
[2]=>
string(1) ""
[3]=>
string(1) ""
[4]=>
string(1) "e"
[5]=>
string(1) "f"
[6]=>
string(1) "g"
[7]=>
string(1) "h"
}
But I expected this output instead:
object(FFI\CData:char[8])#1 (8) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
[4]=>
string(1) "e"
[5]=>
string(1) "f"
[6]=>
string(1) "g"
[7]=>
string(1) "h"
}
object(FFI\CData:int32_t)#2 (1) {
["cdata"]=>
int(1684234849)
}
object(FFI\CData:char[8])#1 (8) {
[0]=>
string(1) ""
[1]=>
string(1) ""
[2]=>
string(1) ""
[3]=>
string(1) ""
[4]=>
string(1) "e"
[5]=>
string(1) "f"
[6]=>
string(1) "g"
[7]=>
string(1) "h"
}
object(FFI\CData:int32_t)#4 (1) {
["cdata"]=>
int(721424396)
}
object(FFI\CData:char[8])#1 (8) {
[0]=>
string(1) ""
[1]=>
string(1) ""
[2]=>
string(1) ""
[3]=>
string(1) ""
[4]=>
string(1) ""
[5]=>
string(1) ""
[6]=>
string(1) ""
[7]=>
string(1) ""
}
PHP Version
PHP 8.1.1
Operating System
No response
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, die bereitgestellte Reproduktion von PHP 8.1.1 FFI::cast() auszuführen, und vergleiche Zeiger-Casts von $val mit Casts von $val + 4. Untersuche anschließend den Einstiegspunkt von FFI::cast() und zugehörige Tests, sofern vorhanden. Als abgeschlossen gilt die Aufgabe, wenn das dokumentierte Verhalten gemeinsamer Referenzen für beide Casts konsistent ist oder die Dokumentation das überprüfte Verhalten eindeutig widerspiegelt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- c, php
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100