FFI::cast() from pointer returns new value instead of reference.
Nessuno ha ancora preso questa issue.
- Lingua principale
- C
- Stelle
- 40.4k
- Fork
- 8.1k
- Merge medio
- 2g 13h
- PR unite (30g)
- 96
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia eseguendo la riproduzione fornita di PHP 8.1.1 FFI::cast() e confronta i cast di puntatori da $val con i cast da $val + 4. Poi esamina il punto di ingresso di FFI::cast() e i test correlati, se presenti. Il lavoro è completato quando il comportamento documentato del riferimento condiviso è coerente per entrambi i cast, oppure quando la documentazione riflette chiaramente il comportamento verificato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- c, php
- Ambito
- backend
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100