Replace zend_object object with its header to prevent the "using flexible array in the middle of another struct" problem in its inheritted classes (static analyzer report)
まだ誰も着手していません。
- 主要言語
- C
- スター
- 40.4k
- フォーク
- 8.1k
- 平均マージ
- 2日 13時間
- マージ済み PR(30日)
- 96
説明
Class zend_object is defined as a flexible array of length 1. The flexible array defined with size 1 and 0 is not the standard behavior. It is suggested to use the unsized definition (https://people.kernel.org/kees/bounded-flexible-arrays-in-c). Besides, not all its subclasses will use the array field properties_table of the zend_object class. If I understand the code correctly, when the properties_table[0] field is not used, it will store a ZVAL_UNDEF zval indicating the end of the iteration. Whereas when the properties_table[0] field is used, the flags and array length are checked first before accessing the data in the array.
If the properties_table[0] field is not used in these sub-classes, will it be better to replace the zend_object in these classes with only the header part of zend_object?
i.e. (as suggested in case 2 of https://lpc.events/event/18/contributions/1722/attachments/1591/3303/Wfamnae_lpceu2024.pdf)
We can define another struct with only the header part (let's name it zend_object_header_part), but leave the zend_object struct with both the header and the flexible array part.
When only the header is needed, we can use the zend_object_header_part (e.g. in the class inheritance), whereas for those requiring the array part, or using the object through a zend_object pointer, we can still use the full definition.
Usages of zend_object in the middle of other structs whose array field is potentially never used through the composite struct:
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/Zend/zend_generators.h#L58-L59
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/Zend/zend_interfaces.c#L490-L491
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/Zend/zend_closures.c#L31-L32
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/Zend/zend_fibers.h#L102-L104
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/Zend/zend_iterators.h#L64-L65
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/opcache/jit/zend_jit_ir.c#L8451-L8452
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/com_dotnet/com_saproxy.c#L35-L36
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/com_dotnet/php_com_dotnet_internal.h#L28-L29
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/com_dotnet/com_persist.c#L278-L279
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/ffi/ffi.c#L169-L170
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/ffi/ffi.c#L191-L192
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/ffi/ffi.c#L199-L200
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/pdo/php_pdo_driver.h#L645-L646
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/zend_test/fiber.h#L24-L25
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/intl/normalizer/normalizer_class.h#L25-L26
- https://github.com/php/php-src/blob/c2fddac8ca2c13b53dfe1044e9355355ae602e30/ext/intl/locale/locale_class.h#L25-L26
report ids: 250106-1639:1-6,8-17 (16 reports in total)
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
zend_object の定義から始め、Zend/zend_generators.h と ext/pdo/php_pdo_driver.h にあるチェック済みの使用箇所を、Zend と ext に列挙されている未チェックの複合構造体と比較します。どのクラスに properties_table が必要かを判断し、必要な場合は完全なオブジェクトを保持し、それ以外ではヘッダーのみの表現を使用します。完了条件は、動作を変更せずに、列挙された static-analyzer のレポートに対処することです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- c, php
- 領域
- compilers
- issue の種類
- リファクタリング
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100