php / php/php-src

FFI::cast() from pointer returns new value instead of reference.

Aperta
#7,904 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Extension: ffi Status: Verified
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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. 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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.