develooper Front page | perl.perl5.porters | Postings from November 2016

[perl #130152] undefined values in array of hashrefs without walkingthe reference tree

Thread Next
From:
Jeffrey Ratcliffe
Date:
November 24, 2016 07:19
Subject:
[perl #130152] undefined values in array of hashrefs without walkingthe reference tree
Message ID:
rt-4.0.24-7108-1479845464-11.130152-75-0@perl.org
# New Ticket Created by  "Jeffrey Ratcliffe" 
# Please include the string:  [perl #130152]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=130152 >


This is a bug report for perl from Jeffrey.Ratcliffe@gmail.com,
generated with the help of perlbug 1.40 running under perl 5.24.1.


-----------------------------------------------------------------
[Please describe your issue here]

The attached script produces the following errors:

$ perl bug.pl
1..1
Use of uninitialized value $key in string eq at bug.pl line 85.
Use of uninitialized value $key in string eq at bug.pl line 85.
Use of uninitialized value $key in string eq at bug.pl line 85.
Use of uninitialized value $name in string eq at bug.pl line 68.
Error: no option name at bug.pl line 22.
        A::add_option(A=HASH(0x78424c0), undef, undef) called at bug.pl line 74
        A::map_names(A=HASH(0x7841db8)) called at bug.pl line 17
        A::new_from_data("A", ARRAY(0x76d57b8)) called at bug.pl line 95
# Looks like your test exited with 255 before it could output anything.

However the key and value in the hashref is defined.

If the Dumper call in line 49 is uncommented, then it runs without errors.

It seems that the Dumper is walking the reference tree, and "finding"
the contents of the hashref.

The hashref contains a sort of tuple. If I refactor the code to use
arrayrefs instead of the hashrefs (see diff below), then it also runs
without error.

$ diff -uN bug.pl bug-fix.pl
--- bug.pl      2016-11-22 10:08:38.290045000 +0100
+++ bug-fix.pl  2016-11-22 10:24:05.554092000 +0100
@@ -20,13 +20,13 @@
 sub add_option {
     my ( $self, $name, $val ) = @_;
     if ( not defined $name or $name eq q{} ) { croak 'Error: no option name' }
-    push @{ $self->{data} }, { $name => $val };
+    push @{ $self->{data} }, [ $name, $val ];
     return;
 }

 sub get_option_by_index {
     my ( $self, $i ) = @_;
-    return each %{ $self->{data}[ $i - 1 ] };
+    return @{ $self->{data}[ $i - 1 ] };
 }

 # an iterator for options
@@ -92,9 +92,9 @@
 #########################

 my $a = A->new;
-$a = A->new_from_data([ { l => 1 }, { y => 50 }, { x => 50 }, { t => 2 } ]);
+$a = A->new_from_data([ [ 'l', 1 ], [ 'y', 50 ], [ 'x', 50 ], [ 't', 2 ] ]);
 is_deeply(
-    $a->{data}, [ { l => 1 }, { y => 50 }, { x_new => 51 }, { t => 2 } ],
+    $a->{data}, [ [ 'l', 1 ], [ 'y', 50 ], [ 'x_new', 51 ], [ 't', 2 ] ],
     'basic functionality map_names'
 );


[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
    category=core
    severity=low
---
Site configuration information for perl 5.24.1:

Configured by Debian Project at Sun Sep 25 20:22:41 UTC 2016.

Summary of my perl5 (revision 5 version 24 subversion 1) configuration:

  Platform:
    osname=linux, osvers=3.16.0, archname=x86_64-linux-gnu-thread-multi
    uname='linux localhost 3.16.0 #1 smp debian 3.16.0 x86_64 gnulinux '
    config_args='-Dusethreads -Duselargefiles
-Dcc=x86_64-linux-gnu-gcc -Dcpp=x86_64-linux-gnu-cpp
-Dld=x86_64-linux-gnu-gcc -Dccflags=-DDEBIAN -Wdate-time
-D_FORTIFY_SOURCE=2 -g -O2
-fdebug-prefix-map=/build/perl-H4FYPE/perl-5.24.1~rc3=.
-fstack-protector-strong -Wformat -Werror=format-security -Dldflags=
-Wl,-z,relro -Dlddlflags=-shared -Wl,-z,relro -Dcccdlflags=-fPIC
-Darchname=x86_64-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.24
-Darchlib=/usr/lib/x86_64-linux-gnu/perl/5.24 -Dvendorprefix=/usr
-Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/x86_64-linux-gnu/perl5/5.24
-Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.24.1
-Dsitearch=/usr/local/lib/x86_64-linux-gnu/perl/5.24.1
-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3
-Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3
-Dusesitecustomize -Duse64bitint -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio
-Uusenm -Ui_libutil -Uversiononly -DDEBUGGING=-g -Doptimize=-O2 -dEs
-Duseshrplib -Dlibperl=libperl.so.5.24.1'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='x86_64-linux-gnu-gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE
-DDEBIAN -fwrapv -fno-strict-aliasing -pipe -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2 -g',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv
-fno-strict-aliasing -pipe -I/usr/local/include'
    ccversion='', gccversion='6.2.0 20160914', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8,
byteorder=12345678, doublekind=3
    d_longlong=define, longlongsize=8, d_longdbl=define,
longdblsize=16, longdblkind=3
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='x86_64-linux-gnu-gcc', ldflags =' -fstack-protector-strong
-L/usr/local/lib'
    libpth=/usr/local/lib
/usr/lib/gcc/x86_64-linux-gnu/6/include-fixed
/usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu
/lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib
    libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=libc-2.24.so, so=so, useshrplib=true, libperl=libperl.so.5.24
    gnulibc_version='2.24'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib
-fstack-protector-strong'

Locally applied patches:
    RC3
    DEBPKG:debian/cpan_definstalldirs - Provide a sensible INSTALLDIRS
default for modules installed from CPAN.
    DEBPKG:debian/db_file_ver - http://bugs.debian.org/340047 Remove
overly restrictive DB_File version check.
    DEBPKG:debian/doc_info - Replace generic man(1) instructions with
Debian-specific information.
    DEBPKG:debian/enc2xs_inc - http://bugs.debian.org/290336 Tweak
enc2xs to follow symlinks and ignore missing @INC directories.
    DEBPKG:debian/errno_ver - http://bugs.debian.org/343351 Remove
Errno version check due to upgrade problems with long-running
processes.
    DEBPKG:debian/libperl_embed_doc - http://bugs.debian.org/186778
Note that libperl-dev package is required for embedded linking
    DEBPKG:fixes/respect_umask - Respect umask during installation
    DEBPKG:debian/writable_site_dirs - Set umask approproately for
site install directories
    DEBPKG:debian/extutils_set_libperl_path - EU:MM: set location of
libperl.a under /usr/lib
    DEBPKG:debian/no_packlist_perllocal - Don't install .packlist or
perllocal.pod for perl or vendor
    DEBPKG:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to
the binary targets.
    DEBPKG:debian/instmodsh_doc - Debian policy doesn't install
.packlist files for core or vendor.
    DEBPKG:debian/ld_run_path - Remove standard libs from LD_RUN_PATH
as per Debian policy.
    DEBPKG:debian/libnet_config_path - Set location of libnet.cfg to
/etc/perl/Net as /usr may not be writable.
    DEBPKG:debian/mod_paths - Tweak @INC ordering for Debian
    DEBPKG:debian/prune_libs - http://bugs.debian.org/128355 Prune the
list of libraries wanted to what we actually need.
    DEBPKG:fixes/net_smtp_docs - [rt.cpan.org #36038]
http://bugs.debian.org/100195 Document the Net::SMTP 'Port' option
    DEBPKG:debian/perlivp - http://bugs.debian.org/510895 Make perlivp
skip include directories in /usr/local
    DEBPKG:debian/deprecate-with-apt - http://bugs.debian.org/747628
Point users to Debian packages of deprecated core modules
    DEBPKG:debian/squelch-locale-warnings -
http://bugs.debian.org/508764 Squelch locale warnings in Debian
package maintainer scripts
    DEBPKG:debian/skip-upstream-git-tests - Skip tests specific to the
upstream Git repository
    DEBPKG:debian/patchlevel - http://bugs.debian.org/567489 List
packaged patches for 5.24.1~rc3-3 in patchlevel.h
    DEBPKG:debian/skip-kfreebsd-crash - http://bugs.debian.org/628493
[perl #96272] Skip a crashing test case in t/op/threads.t on
GNU/kFreeBSD
    DEBPKG:fixes/document_makemaker_ccflags -
http://bugs.debian.org/628522 [rt.cpan.org #68613] Document that
CCFLAGS should include $Config{ccflags}
    DEBPKG:debian/find_html2text - http://bugs.debian.org/640479
Configure CPAN::Distribution with correct name of html2text
    DEBPKG:debian/perl5db-x-terminal-emulator.patch -
http://bugs.debian.org/668490 Invoke x-terminal-emulator rather than
xterm in perl5db.pl
    DEBPKG:debian/cpan-missing-site-dirs -
http://bugs.debian.org/688842 Fix CPAN::FirstTime defaults with
nonexisting site dirs if a parent is writable
    DEBPKG:fixes/memoize_storable_nstore - [rt.cpan.org #77790]
http://bugs.debian.org/587650 Memoize::Storable: respect 'nstore'
option not respected
    DEBPKG:debian/regen-skip - Skip a regeneration check in unrelated
git repositories
    DEBPKG:debian/makemaker-pasthru - http://bugs.debian.org/758471
Pass LD settings through to subdirectories
    DEBPKG:debian/makemaker-manext - http://bugs.debian.org/247370
Make EU::MakeMaker honour MANnEXT settings in generated manpage
headers
    DEBPKG:debian/devel-ppport-reproducibility -
http://bugs.debian.org/801523 Sort the list of XS code files when
generating RealPPPort.xs
    DEBPKG:debian/encode-unicode-bom-doc -
http://bugs.debian.org/798727 Document Debian backport of
Encode::Unicode fix
    DEBPKG:debian/kfreebsd-softupdates - http://bugs.debian.org/796798
Work around Debian Bug#796798
    DEBPKG:fixes/autodie-scope - http://bugs.debian.org/798096 Fix a
scoping issue with "no autodie" and the "system" sub
    DEBPKG:fixes/crosscompile-no-targethost - [23695c0] [perl #127234]
Fix the Configure escape with usecrosscompile but no targethost
    DEBPKG:fixes/memoize-pod - [rt.cpan.org #89441] Fix POD errors in Memoize
    DEBPKG:fixes/ok-pod - Added encoding for pod.
    DEBPKG:debian/hurd-softupdates - http://bugs.debian.org/822735 Fix
t/op/stat.t failures on hurd
    DEBPKG:fixes/nntp_docs - http://bugs.debian.org/51962 Net::NNTP:
Correct innd/nnrpd confusion in relation to Reader option
    DEBPKG:fixes/math_complex_doc_great_circle -
http://bugs.debian.org/697567 [rt.cpan.org #114104] Math::Trig:
clarify definition of great_circle_midpoint
    DEBPKG:fixes/math_complex_doc_see_also -
http://bugs.debian.org/697568 [rt.cpan.org #114105] Math::Trig: add
missing SEE ALSO
    DEBPKG:fixes/math_complex_doc_angle_units -
http://bugs.debian.org/731505 [rt.cpan.org #114106] Math::Trig:
document angle units
    DEBPKG:fixes/cpan_web_link - http://bugs.debian.org/367291 CPAN:
Add link to main CPAN web site
    DEBPKG:fixes/time_piece_doc - http://bugs.debian.org/817925
Time::Piece: Improve documentation for add_months and add_years
    DEBPKG:fixes/perlbug-refactor - http://bugs.debian.org/822463
[perl #128020] perlbug: Refactor duplicated file reading code
    DEBPKG:fixes/perlbug-linewrap - http://bugs.debian.org/822463
[perl #128020] perlbug: wrap overly long lines
    DEBPKG:fixes/hurd_sigaction - http://bugs.debian.org/825016
[d54f4ed] ext/POSIX/t/sigaction.t: Skip uid and pid tests on GNU/Hurd
    DEBPKG:fixes/hurd_hints - [4694301] http://bugs.debian.org/825020
[perl #128279] Modify hints for Hurd per Debian ticket 825020.
    DEBPKG:fixes/extutils-parsexs-reproducibility - [perl #128517]
http://bugs.debian.org/829296 Make the output of ExtUtils::ParseXS
reproducible
    DEBPKG:debian/CVE-2016-1238/sitecustomize-in-etc - Look for
sitecustomize.pl in /etc/perl rather than sitelib on Debian systems
    DEBPKG:debian/CVE-2016-1238/test-suite-without-dot - [perl
#127810] Patch unit tests to explicitly insert "." into @INC when
needed.
    DEBPKG:debian/CVE-2016-1238/eumm-without-dot - [perl #127810] Add
PERL_USE_UNSAFE_INC support to EU::MM for fortify_inc support.
    DEBPKG:debian/CVE-2016-1238/cpan-without-dot - [perl #127810] Set
PERL_USE_UNSAFE_INC for cpan usage
    DEBPKG:debian/document_inc_removal - Document in perlvar that we
remove '.' from @INC by default
    DEBPKG:fixes/extutils_makemaker_reproducible -
http://bugs.debian.org/835815 http://bugs.debian.org/834190 Make
perllocal.pod files reproducible
    DEBPKG:debian/CVE-2016-1238/remove-inc-test - Remove test for '.'
in @INC as it might not be
    DEBPKG:debian/customized - Update customized.dat for files patched in Debian
    DEBPKG:fixes/file_path_hurd_errno - File-Path: Fix test failure in
Hurd due to hard-coded ENOENT

---
@INC for perl 5.24.1:
    /etc/perl
    /usr/local/lib/x86_64-linux-gnu/perl/5.24.1
    /usr/local/share/perl/5.24.1
    /usr/lib/x86_64-linux-gnu/perl5/5.24
    /usr/share/perl5
    /usr/lib/x86_64-linux-gnu/perl/5.24
    /usr/share/perl/5.24
    /usr/local/lib/site_perl
    /usr/lib/x86_64-linux-gnu/perl-base

---
Environment for perl 5.24.1:
    HOME=/home/jeff
    LANG=en_GB.UTF-8
    LANGUAGE=en_GB:en
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    PERL_BADLANG (unset)
    SHELL=/bin/bash

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About