Skip to content

Segfault with array_multisort + array_shift (packed arrays?) #9244

Closed

Description

@chschneider

Description

The following code:

<?php
$items = ['foo' => 1, 'bar' => 2];
$order = [4, 3];
array_multisort($order, $items);
var_dump(array_shift($items));

Resulted in this output:

Segmentation fault (core dumped)

But I expected this output instead:

int(2)

After bisecting the relevant commit seems to be

commit 90b7bde61507cee1c6b37f153909d72f5b203b8c
Author: Dmitry Stogov <[email protected]>
Date:   Wed Nov 3 15:18:26 2021 +0300

    Use more compact representation for packed arrays.
    
    - for packed arrays we store just an array of zvals without keys.
    - the elements of packed array are accessible throuf as ht->arPacked[i]
      instead of ht->arData[i]
    - in addition to general ZEND_HASH_FOREACH_* macros, we introduced similar
      familied for packed (ZEND_HASH_PACKED_FORECH_*) and real hashes
      (ZEND_HASH_MAP_FOREACH_*)
    - introduced an additional family of macros to access elements of array
      (packed or real hashes) ZEND_ARRAY_ELEMET_SIZE, ZEND_ARRAY_ELEMET_EX,
      ZEND_ARRAY_ELEMET, ZEND_ARRAY_NEXT_ELEMENT, ZEND_ARRAY_PREV_ELEMENT
    - zend_hash_minmax() prototype was changed to compare only values
    
    Because of smaller data set, this patch may show performance improvement
    on some apps and benchmarks that use packed arrays. (~1% on PHP-Parser)
    
    TODO:
        - sapi/phpdbg needs special support for packed arrays (WATCH_ON_BUCKET).
        - zend_hash_sort_ex() may require converting packed arrays to hash. 

This commit is too complex for me to come up with a fix. But the last TODO mentioned in the commit message could be an indication of what is going wrong.

PHP Version

PHP 8.2.0-dev

Operating System

openSUSE Leap 15.3

Activity

  1. added a commit that references this issue on Aug 4, 2022
    d37c328
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions