Bug#1012375: perl: Data::Dumper vs. shared and unshared circular loops
David Christensen
dpchrist at holgerdanske.com
Sun Jun 5 22:03:13 BST 2022
Package: perl
Version: 5.32.1-4+deb11u2
Severity: normal
X-Debbugs-Cc: dpchrist at holgerdanske.com
Dear Maintainer,
Data::Dumper has problems with data structures built with shared arrays
and shared hashes that contain self-referencing loops. See console
session, below.
I suspect the problem is that Data::Dumper is using reference
stringification or Scalar::Util::refaddr to remember references when
walking data structures.
I have found that using threads::shared::is_shared provides correct
results.
These problems are not Debian-specific; they have existed in Perl for
many years.
David
2022-06-05 13:56:30 dpchrist at laalaa ~/sandbox/perl
$ cat /etc/debian_version ; uname -a
11.3
Linux laalaa 5.10.0-14-amd64 #1 SMP Debian 5.10.113-1 (2022-04-29) x86_64 GNU/Linux
2022-06-05 13:57:36 dpchrist at laalaa ~/sandbox/perl
$ dpkg-query --show perl
perl 5.32.1-4+deb11u2
2022-06-05 13:57:44 dpchrist at laalaa ~/sandbox/perl
$ perl -MData::Dumper -e 'print $Data::Dumper::VERSION, "\n"'
2.174_01
2022-06-05 13:58:08 dpchrist at laalaa ~/sandbox/perl
$ cat Data-Dumper-vs-shared-unshared-circular-loops.t
#!/usr/bin/env perl
#######################################################################
# $Id: Data-Dumper-vs-shared-unshared-circular-loops.t,v 1.2 2022/06/05 20:56:22 dpchrist Exp $
# by David Paul Christensen dpchrist at holgerdanske.com
# Public Domain
#
# Demonstration of Data::Dumper->Dump() for data structures built with
# non-shared and shared variables with self-referencing loops.
#======================================================================
use strict;
use warnings;
use threads;
use threads::shared;
use Data::Dumper;
use Getopt::Long;
use Test::More;
my $d;
my @ca;
push @ca, \@ca;
my %ch;
$ch{loop} = \%ch;
my $cs;
$cs = \$cs;
my @csa :shared;
push @csa, \@csa;
my %csh :shared;
$csh{loop} = \%csh;
my $css :shared;
$css = \$css;
eval { chomp($d = Data::Dumper->Dump([$cs], ['cs'])) };
if ($@) { fail("cs: $@") } else { pass("cs: $d") };
eval { chomp($d = Data::Dumper->Dump([$css], ['css'])) };
if ($@) { fail("css: $@") } else { pass("css: $d") };
eval { chomp($d = Data::Dumper->Dump([\@ca], ['*ca'])) };
if ($@) { fail("ca: $@") } else { pass("ca: $d") };
eval { chomp($d = Data::Dumper->Dump([\@csa], ['*csa'])) };
if ($@) { fail("csa: $@") } else { pass("csa: $d") };
eval { chomp($d = Data::Dumper->Dump([\%ch], ['*ch'])) };
if ($@) { fail("ch: $@") } else { pass("ch: $d") };
eval { chomp($d = Data::Dumper->Dump([\%csh], ['*csh'])) };
if ($@) { fail("csh: $@") } else { pass("csh: $d") };
done_testing;
#######################################################################
2022-06-05 13:58:12 dpchrist at laalaa ~/sandbox/perl
$ perl Data-Dumper-vs-shared-unshared-circular-loops.t
ok 1 - cs: $cs = \$cs;
ok 2 - css: $css = \$css;
ok 3 - ca: @ca = (
# \@ca
# );
not ok 4 - csa: Recursion limit of 1000 exceeded at /usr/lib/x86_64-linux-gnu/perl/5.32/Data/Dumper.pm line 232.
#
# Failed test 'csa: Recursion limit of 1000 exceeded at /usr/lib/x86_64-linux-gnu/perl/5.32/Data/Dumper.pm line 232.
# '
# at Data-Dumper-vs-shared-unshared-circular-loops.t line 49.
ok 5 - ch: %ch = (
# 'loop' => \%ch
# );
not ok 6 - csh: Recursion limit of 1000 exceeded at /usr/lib/x86_64-linux-gnu/perl/5.32/Data/Dumper.pm line 232.
#
# Failed test 'csh: Recursion limit of 1000 exceeded at /usr/lib/x86_64-linux-gnu/perl/5.32/Data/Dumper.pm line 232.
# '
# at Data-Dumper-vs-shared-unshared-circular-loops.t line 55.
1..6
# Looks like you failed 2 tests of 6.
-- System Information:
Debian Release: 11.3
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable-security'), (500, 'stable')
Architecture: amd64 (x86_64)
Kernel: Linux 5.10.0-14-amd64 (SMP w/8 CPU threads)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=C, LC_CTYPE=C.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages perl depends on:
ii dpkg 1.20.10
ii libperl5.32 5.32.1-4+deb11u2
ii perl-base 5.32.1-4+deb11u2
ii perl-modules-5.32 5.32.1-4+deb11u2
Versions of packages perl recommends:
ii netbase 6.3
Versions of packages perl suggests:
pn libtap-harness-archive-perl <none>
pn libterm-readline-gnu-perl | libterm-readline-perl-perl <none>
ii make 4.3-4.1
ii perl-doc 5.32.1-4+deb11u2
-- no debconf information
More information about the Perl-maintainers
mailing list