Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Perl

...

has

...

a

...

large

...

number

...

of

...

punctuation

...

variables.

...

They

...

control

...

the

...

behavior

...

of

...

various

...

operations

...

in

...

the

...

Perl

...

interpreter.

...

While

...

they

...

are

...

initially

...

set

...

to

...

reasonable

...

default

...

values,

...

any

...

Perl

...

code

...

has

...

the

...

ability

...

to

...

change

...

their

...

values

...

for

...

its

...

own

...

internal

...

purposes.

...

If

...

a

...

program

...

modifies

...

one

...

of

...

these

...

variables,

...

it

...

is

...

obligated

...

to

...

reset

...

the

...

variable

...

back

...

to

...

its

...

default

...

value,

...

lest

...

it

...

alter

...

the

...

behavior

...

of

...

subsequent

...

unrelated

...

code.

...

The

...

easiest

...

way

...

for

...

a

...

program

...

to

...

'clean

...

up

...

after

...

itself'

...

is

...

to

...

declare

...

such

...

variables

...

local

...

when

...

modifying

...

them.

...

Noncompliant Code Example

This noncompliant code example shows a subroutine that counts the number of virtual users on this platform. This is deduced by the number of users in the /etc/passwd file that use the program /usr/bin/false

...

as

...

their

...

shell.

{:=|=
Code Block
bgColor
#ffcccc
lang
perl
}
sub count_virtual_users {
  my $result = 0;
  $/ = ":";
  open( PASSWD, "<", "/etc/passwd");
  while (<PASSWD>) {
    @items = split "\n";
    foreach (@items) {
      if ($_ eq "/usr/bin/false") {
        $result++;
      }
    }
  }
  $result;
}
{code}

This

...

program

...

produces

...

the

...

correct

...

result,

...

however

...

it

...

leaves

...

the

...

$/

...

variable

...

set

...

to

...

an

...

unusual

...

value

...

(

...

:

...

).

...

Subsequent

...

reads

...

of

...

any

...

file

...

will

...

use

...

this

...

character

...

as

...

the

...

end-of-line

...

delimiter,

...

rather

...

than

...

the

...

typical

...

newline,

...

which

...

is

...

the

...

default

...

value.

Compliant Solution

This compliant solution again produces the same result, but localizes the punctuation variable. Consequently, when the subroutine returns, the $/ variable is restored to its original value, and subsequent file reads behave as expected.

Code Block
bgColor#ccccff
langperl



h2. Compliant Solution

This compliant solution again produces the same result, but localizes the punctuation variable. Consequently, when the subroutine returns, the {{$/}} variable is restored to its original value, and subsequent file reads behave as expected.

{code:bgColor=#ccccff|lang=perl}
sub count_virtual_users {
  my $result = 0;
  local $/ = ":";
  open( PASSWD, "<", "/etc/passwd");
  while (<PASSWD>) {
    @items = split "\n";
    foreach (@items) {
      if ($_ eq "/usr/bin/false") {
        $result++;
      }
    }
  }
  $result;
}
{code}


h2. Exceptions

*

Exceptions

DCL02-EX0

...

:

...

The

...

following

...

global

...

variables

...

may

...

be

...

modified

...

without

...

being

...

declared

...

local

...

:

$_

...

$ARG

 

@_

@ARG

 

$!

$ERRNO

$OS_ERROR

 

%ENV

$ENV{expr}

 

%SIG

$SIG{expr}

 

%INC

 

Risk Assessment

Modifying punctuation variables without declaring them local can corrupt data and create unexpected program behavior.

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

DCL02-PL

low

probable

medium

P2

L3

Automated Detection

Tool

Diagnostic

Perl::Critic

Variables::RequireLocalizedPunctuationVars

Bibliography

Wiki Markup
\[[CPAN|AA. Bibliography#CPAN]\] [Elliot Shank, Perl-Critic-1.116|http://search.cpan.org/~elliotjs/Perl-Critic-1.116/] [Variables::RequireLocalizedPunctuationVars|http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/Variables/RequireLocalizedPunctuationVars.pm]
\[[Wall 2011|AA. Bibliography#Manpages]\] [perlfunc|http://perldoc.perl.org/perlfunc.html], [perlvar|http://perldoc.perl.org/perlvar.html] 

...

...

Image Added      01. Declarations and Initialization      DCL32-PL.

...

Every

...

module

...

must

...

return

...

a

...

true

...

value

...