php / php/php-src

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

オープン
#7,904 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Bug Extension: ffi Status: Verified
主要言語
C
スター
40.4k
フォーク
8.1k
平均マージ
2日 13時間
マージ済み PR(30日)
96

説明

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

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず、提供されている PHP 8.1.1 FFI::cast() の再現コードを実行し、$val からのポインターキャストと $val + 4 からのキャストを比較します。次に、FFI::cast() のエントリーポイントと、存在する場合は関連するテストを調べます。両方のキャストで、文書化された共有参照の動作に一貫性があるか、または文書が検証済みの動作を明確に反映していれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
c, php
領域
backend
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。