FFI::cast() from pointer returns new value instead of reference.
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.1k
- Merge medio
- 2 d 13 h
- PR fusionados (30 d)
- 96
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza ejecutando la reproducción proporcionada de PHP 8.1.1 FFI::cast() y compara las conversiones de punteros desde $val con las conversiones desde $val + 4. Después, inspecciona el punto de entrada de FFI::cast() y las pruebas relacionadas, si existen. Se considera terminado cuando el comportamiento documentado de referencia compartida es coherente para ambas conversiones, o cuando la documentación refleja claramente el comportamiento verificado.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- c, php
- Área
- backend
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100