in reply to Re: Code Loop?
in thread Code Loop?

It would be nice to have a strict feature to catch such special variable "zombies", but I'm not sure how to implement it.

Point is that $@ is a special global package variable, with the glob *main::@ , hence this glob has slots for an array, hash, function,... without being declared.

like

D:\Users\lanx>perl -E "use strict; say @@" D:\Users\lanx>perl -E "use strict; say *@" *main::@

IMHO in at least 95% of the cases these slots are used accidentally.

Some use them intentionally, but could activate a pragma in these cases. °

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

°) dunno many obfuscators who use strict anyway ;-)

Replies are listed 'Best First'.
Re^3: Code Loop?
by Corion (Patriarch) on Aug 08, 2018 at 14:31 UTC

    You could poison them with a tie to catch uses at runtime:

    package Tie::Poison; sub TIESCALAR { ... } sub TIEARRAY { ... } sub FETCH { my $var = tied $_[0]; die "Prohibited variable '$$var' used"; } package unusual_variable_names; our @unusual = qw( @@ @$ ... ); sub unimport { for my $name (@unusual) { no strict 'refs'; tie @{ $name }, 'Tie::Poison', $name; }; }; ... package main; no unusual_variable_names;
      yep but as you said it's only runtime.

      But it should be feasible to write a an op-code walker catching them at compile time in the UNITCHECK phase.

      D:\>perl -MO=Terse -E "use strict; say @@" LISTOP (0x2820630) leave [1] OP (0x2820600) enter COP (0x2820670) nextstate LISTOP (0x2820700) say OP (0x28206d0) pushmark UNOP (0x2820740) rv2av [2] <-- array PADOP (0x2820778) gv GV (0x1dede0) *@ <-- of glob *@ -e syntax OK D:\>perl -MO=Concise -E "use strict; say @@" 7 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 48 -e:1) v:%,*,&,{,x*,x&,x$,$,469764096 ->3 6 <@> say vK ->7 3 <0> pushmark s ->4 5 <1> rv2av[t2] lK/3 ->6 <-- array 4 <#> gv[*@] s ->5 <-- of glob *@ -e syntax OK

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice