Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Perl Misc (http://www.velocityreviews.com/forums/f67-perl-misc.html)
-   -   Detecting sub/call mismatches? (http://www.velocityreviews.com/forums/t954696-detecting-sub-call-mismatches.html)

Tim McDaniel 11-21-2012 03:07 AM

Detecting sub/call mismatches?
 
I'm moving subs from one source file to another, and sometimes
renaming them according to a more unified naming convention, so
OldModule::OldName
OldName (while in package OldModule)
should all be changed to NewModule::NewName.

The problem, of course, is when I screw up a call to some version of
the old name, which (so far) has ended up as
OldModule::OldName (that is, I overlooked it entirely)
OldModule::NewName
OldName (while in package OldModule; overlooked)
NewName (while in package OldModule, so that's OldModule::NewName)
I've caught these by eyeball inspection and I'll go thru it again, but
I'm nervous.

In Perl, of course, you can't in general do a static "compile time"
check -- in principle, there could be a sub defined with eval, a
reference to a sub, a sub name generated by code, et cetera.

Nevertheless, even if I can't get perfection, I'd like to do some
static verification if it's possible -- a Perl lint, for those
familiar with the old C tool. In practice, our code rarely does
obscure things. All I've seen are package declarations alone on a
line, and "sub SomeName *{" starting in column 1, and calls to
SomeModule:SomeName, except within SomeModule, where we usually do
just SomeName.

Is there anything I can do to get a partial check?

I've thought of hacking together a script that reads source files to
look for package and sub declarations to generate a table of potential
definitions, and the uses are every word that is followed by a left
paren. I could get some false results due to not following the proper
parsing (is there a module to parse Perl code?), like misunderstanding
quotation or comments. But even if I find one error now instead of
several weeks from now when some obscure path is finally run, and get
a slew of bad hits, I'd be happier.

--
Tim McDaniel, tmcd@panix.com

C.DeRykus 11-21-2012 03:38 AM

Re: Detecting sub/call mismatches?
 
On Tuesday, November 20, 2012 7:07:11 PM UTC-8, Tim McDaniel wrote:
> I'm moving subs from one source file to another, and sometimes
>
> renaming them according to a more unified naming convention, so
>
> OldModule::OldName
>
> OldName (while in package OldModule)
>
> should all be changed to NewModule::NewName.
>
>
>
> The problem, of course, is when I screw up a call to some version of
>
> the old name, which (so far) has ended up as
>
> OldModule::OldName (that is, I overlooked it entirely)
>
> OldModule::NewName
>
> OldName (while in package OldModule; overlooked)
>
> NewName (while in package OldModule, so that's OldModule::NewName)
>
> I've caught these by eyeball inspection and I'll go thru it again, but
>
> I'm nervous.
>
>
>
> In Perl, of course, you can't in general do a static "compile time"
>
> check -- in principle, there could be a sub defined with eval, a
>
> reference to a sub, a sub name generated by code, et cetera.
>
>
>
> Nevertheless, even if I can't get perfection, I'd like to do some
>
> static verification if it's possible -- a Perl lint, for those
>
> familiar with the old C tool. In practice, our code rarely does
>
> obscure things. All I've seen are package declarations alone on a
>
> line, and "sub SomeName *{" starting in column 1, and calls to
>
> SomeModule:SomeName, except within SomeModule, where we usually do
>
> just SomeName.
>
>
>
> Is there anything I can do to get a partial check?
>
>
>
> I've thought of hacking together a script that reads source files to
>
> look for package and sub declarations to generate a table of potential
>
> definitions, and the uses are every word that is followed by a left
>
> paren. I could get some false results due to not following the proper
>
> parsing (is there a module to parse Perl code?), like misunderstanding
>
> quotation or comments. But even if I find one error now instead of
>
> several weeks from now when some obscure path is finally run, and get
>
> a slew of bad hits, I'd be happier.
>
>


B::Xref might help - perldoc B::Xref

--
Charles DeRykus

Tim McDaniel 11-21-2012 06:33 AM

Re: Detecting sub/call mismatches?
 
In article <43ad4a1e-1ff3-49c7-a07f-b31ea250e2ca@googlegroups.com>,
>B::Xref might help - perldoc B::Xref


Interesting -- thank you for the pointer.

It's strange, though, that /^File / lines are so odd:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~
File
Subroutine (definitions)
....

File ^E
Subroutine (definitions)
Package Moose::Error::Util
&_create_error_carpmess s26
&create_error s43
&create_error_confess s34
&create_error_croak s30
File<EB>}
Subroutine (definitions)
....

File
2Bh^W
Subroutine (definitions)
....

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~


--
Tim McDaniel, tmcd@panix.com

Rainer Weikusat 11-21-2012 04:40 PM

Re: Detecting sub/call mismatches?
 
tmcd@panix.com (Tim McDaniel) writes:
> I'm moving subs from one source file to another, and sometimes
> renaming them according to a more unified naming convention, so
> OldModule::OldName
> OldName (while in package OldModule)
> should all be changed to NewModule::NewName.
>
> The problem, of course, is when I screw up a call to some version of
> the old name, which (so far) has ended up as
> OldModule::OldName (that is, I overlooked it entirely)
> OldModule::NewName
> OldName (while in package OldModule; overlooked)
> NewName (while in package OldModule, so that's OldModule::NewName)
> I've caught these by eyeball inspection and I'll go thru it again, but
> I'm nervous.
>
> In Perl, of course, you can't in general do a static "compile time"
> check -- in principle, there could be a sub defined with eval, a
> reference to a sub, a sub name generated by code, et cetera.
>
> Nevertheless, even if I can't get perfection, I'd like to do some
> static verification if it's possible -- a Perl lint, for those
> familiar with the old C tool.


You could try B::Lint.


All times are GMT. The time now is 05:01 PM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57