2012-06-04 5 views
1

CentOS 커널 2.6.18-308.8.1.el5의 PERL (5.8.8)이 잘못된 '초기화되지 않은 변수'경고를 내고 있다고 생각합니다. 내 모든 검색은 합법적 인 초기화되지 않은 가치 문제를 나타냅니다. 아마도 내 것이고, 그렇다면 어떻게되는지에 대한 설명 (그리고 내가하려는 일을 올바르게 수행하는 방법)은 대단 할 것입니다. 나는 또한 hex()에 대한 많은 참조와 올바른 함수 인자 관용구를 살펴 보았고, 나는 그 모든 것을 올바르게 수행하고 있다고 생각한다."초기화되지 않은 값"false positive

내 스크립트는 2 개의 텍스트 파일을 읽습니다. 하나는 32 비트 하드웨어 주소를 포함하고 다른 하나는 그 주소에서 다시 읽는 32 비트 데이터를 포함합니다. 각 파일의 값은 항상 길이가 8 자리의 16 진수이며 두 파일은 100 % 일치합니다 (주소 파일의 1 번 줄은 데이터 파일의 1 번 줄과 일치 함). 데이터 값이있는 경우 비 제로 다 괜찮지 만, 데이터 값이 0 때 경고 얻을 :

Use of uninitialized value in string eq at ../VMetro_Parser.pl line 248. 
Use of uninitialized value in hex at ../VMetro_Parser.pl line 250. 

관련 코드 :

sub ppReg_TX_Mode_Reg { 
    my($data) = @_; # first arg should be the Data field 
    my $ret = "\t"; 
    if($data eq "00000000") { print "TX_Mode_Reg got 0 input\n"; } #LINE 248 
    #croak("data not defined!") unless defined $data; 
    my($hex) = hex($data); #LINE 250 

    $ret .= sprintf("Clear INTs: %02X ",   (($hex >> 25) & 0x7F)); 

입력 예상 된 동작이 생성

을 PERL 스크립트의
Address: 90000004 
Data: 00000004 

출력 :

90000004 00000004 -> Wr TX00 Mode_Reg 
    Clear INTs: 00 
,691,363 PERL 스크립트의

Address: 90000004 
Data: 00000000 

출력 : 예상치 못한 '초기화되지 않은 값'경고 생산 (210)

입력 분명히

90000004 00000000 -> Wr TX00 Mode_Reg 
TX_Mode_Reg got 0 input 
    Clear INTs: 00 

, 그것은 인수가 문자열 "00000000"아직이로 전달 인식에있다 또한 그것이 undef (내가 그것을 주석을 제거한다면 사기꾼 선은 불)다고 생각한다. 뭐라 구요?

하나의 흥미로운 점은 데이터의 다른 인스턴스가 0이지만 경고가 표시되지 않는다는 것입니다. 이 다른 0 데이터는 다른 함수에 의해 처리되고 경고를 throw하는 줄 다음에 발생하지만 처리는 동일합니다 (경고로 인해 추가 된 위의 코드에서 명백한 디버그 작업은 제외).

E.G.

sub ppReg_RX_Master_Mode_Reg { 
    my($data) = @_; # first arg should be the Data field 
    my $ret = "\t"; 
    my($hex) = hex($data); 

경고를 표시하지 않습니다.

+0

결과물에 어떤 경고가 표시되지 않습니까?!?! – ikegami

+2

언어 이름은 "Perl"입니다. 두문자어가 아닙니다. – ikegami

+2

'Use Devel :: Peek qw (덤프); 덤프 ($ 데이터);'(비교 전)는 도움이 될 수 있습니다. – ikegami

답변

1

예상대로 문제는 내 코드가 아닌 Perl에서 발생했습니다. Dispatch Table을 사용하여 처리 기능을 호출하고 있습니다. Dispatch Table 정의의 입력 오류로 인해 Perl이 테이블 선언을 처리 할 때 함수가 호출되었습니다.

잘못된 코드 :

# 'Dispatch table' is a hash for functions 
my %regPPFn = (
     TX_Version_Reg => \&ppReg_TX_Version_Reg, 
     TX_Mode_Reg => \&ppReg_TX_Mode_Reg, 
     TX_Run_Reg => \&ppReg_TX_Run_Reg, 
     ... 
     # Note: GCs are mostly TXs, so mostly call the TX fn()s 
     GC_Version_Reg => \&ppReg_TX_Version_Reg, 
     GC_Mode_Reg => &ppReg_TX_Mode_Reg, 
     GC_DMA => \&ppReg_GC_DMA, 
     GC__Reg => \&ppReg_GC__Reg, 
     "" => sub { print "Dispatch table NULL lookup\n" } 
     ); # Array of pointers to register Pretty Print functions 

당신은 * GC_Mode_Reg *에 대한 함수 참조가 앰퍼샌드 전에 백 슬래시 누락 된 것을 볼 수 있습니다.

GC_Mode_Reg => &ppReg_TX_Mode_Reg, 

GC_Mode_Reg => \&ppReg_TX_Mode_Reg, 

이 데이터 :: 덤퍼 그것은 "지금까지 가능성이 호출 전에 내 함수를 한 번 호출되는 것을 궤도에 저를 얻기에 좋은 첫 번째 단계이고 저를 보여 주었다 사용되어야한다 ". $ | 사용하기 | = 1 또한 출력 텍스트 순서를 믿을 수있었습니다. 나는 내 인쇄 진술에 앞서 나오는 경고 메시지가 버퍼링 때문인 것으로 생각했다.

최초의 가설/질문 제목과 솔루션이 상당히 다르기 때문에 &이 질문을 편집해야한다고 생각하면 알려주십시오. 나는 같은 문제가있는 다른 누군가가 아마 내가 아는 곳과 틀린 곳을 찾고있을 것이기 때문에 그것을 바꿀 것을 주저한다.

1

이것은 Perl에서는 문제가되지 않습니다.

경고가 STDERR로 보내지는 반면 출력은 STDOUT이됩니다. 두 파일은 반드시 동기화되어 있지 않으므로 같은 레코드에 대한 출력으로 경고를 묶을 수는 없습니다.

croak 대신 printdie을 사용하면 경고가 올바른 순서로 표시됩니다.

난 당신이 코드가 유효하지 않은 데이터에 대해 실행되지 않도록하는 것이

sub ppReg_TX_Mode_Reg { 
    my ($data) = @_; 
    do { warn 'Undefined $data parameter'; return; } unless defined $data; 

    . . . 
} 

에 서브 루틴을 변경하는 것이 좋습니다.

파일 레코드에서 데이터를 추출하는 코드에 문제가있을 가능성이 큽니다.빈 줄을 올바르게 처리하고 있습니까? 도움이 필요하면이 코드 부분을 보여주십시오.

+1

'$ | = 1;'(STDOUT에서 버퍼링을 해제하려면) 이러한 문제에도 도움이 될 수 있습니다. – ikegami