📄 checkmem
字号:
#!/usr/bin/perlif ($#ARGV<0) { print "CheckMem <xmo_file>\n"; print "Analyzes output from XMD with CHECK MEM ON option selected\n"; print "and looks for memory leaks.\n"; exit 1; }$InputFileName = $ARGV[0];$ResultOK = open (INPUT, "<" . $InputFileName);if (!$ResultOK) { print "ERROR: Could not open input file $InputFileName\n"; exit 1; }$VarCount=0;$NumCheck=0;$NumError=0;$LineCount = 0;while ($line=<INPUT>) { chop $line; $LineCount++; @Token = split (/[ \t]+/, $line); if ($Token[0] eq "CHECK" && $Token[1] eq "MEM") { $NumCheck++; $VarName = $Token[3]; $VarAddr = $Token[4]; $File = $Token[5]; $LineNo = $Token[6]; # Record of ALLOCATION macro if ($Token[2] eq "ALLO" || $Token[2] eq "ALLO(R)") { # See if first occurance of variable $VarIndex = $VarIndex{$VarAddr}; $IsFirst = ( $VarIndex==0 || $Size[$VarIndex]==0); # Print warning if not first allocation if (!$IsFirst) { $NumError++; print "ALLOCATE: Variable allocated without be free-ed\n"; print "Output File Line Number $LineCount\n"; print "Original Allocation:\n"; print " Name = ", $VarName[$VarIndex], "\n"; print " Addr = ", $VarAddr, "\n"; print " File = ", $File [$VarIndex], "\n"; print " LineNo = ", $LineNo [$VarIndex], "\n"; print " Size = ", $Size [$VarIndex], "\n"; print "New Allocation:\n"; print " Name = ", $VarName, "\n"; print " Addr = ", $VarAddr, "\n"; print " File = ", $File, "\n"; print " LineNo = ", $LineNo, "\n"; print " Size = ", $Token[7], "\n"; print "\n"; } # If new allocation create entry if ($VarIndex{$VarAddr}==0) { $VarCount++; $VarIndex = $VarCount; $VarIndex{$VarAddr} = $VarIndex; } # Store this info $VarAddr [$VarIndex] = $VarAddr; $VarName [$VarIndex] = $VarName; $File [$VarIndex] = $File; $LineNo [$VarIndex] = $LineNo; $Size [$VarIndex] = $Token[7]; } # Record of FREE macro elsif ( $Token[2] eq "FREE" || $Token[2] eq "FREE(R0)" || $Token[2] eq "FREE(R1)" ) { $VarIndex = $VarIndex{$VarAddr}; $IsRealloc = ( $Token[2] eq "FREE(R0)" || $Token[2] eq "FREE(R1)" ); # Error with free statement if not reallocation if (!$IsRealloc) { $IsError = 0; # Variable never allocated if ($VarIndex==0) { $IsError = 1; print "FREE: Freeing variable that was never allocated\n"; } # Variable had empty allocation elsif ($Size[$VarIndex]==0) { $IsError = 1; print "FREE: Freeing variable with zero allocation\n"; } if ($IsError) { $NumError++; print "Output File Line Number $LineCount\n"; print "Name = ", $VarName, "\n"; print "Addr = ", $VarAddr, "\n"; print "File = ", $File, "\n"; print "LineNo = ", $LineNo, "\n"; print "\n"; } } # Mark size as 0 if ($VarIndex!=0) { $Size[$VarIndex] = 0; } } # Record of REALLOC macro elsif ($Token[2] eq "REALLO") { $VarIndex = $VarIndex{$VarAddr}; # Variable never allocated before, make new entry if ($VarIndex==0) { $VarCount++; $VarIndex = $VarCount; $VarIndex{$VarAddr} = $VarIndex; } # Store info $VarAddr [$VarIndex] = $VarAddr; $VarName [$VarIndex] = $VarName; $File [$VarIndex] = $File; $LineNo [$VarIndex] = $LineNo; $Size [$VarIndex] = $Token[7]; } else { print "ERROR: Unknown CHECK MEM option <", $Token[2], ">\n"; } } }close (INPUT);# Print unreleased memoryprint "Unreleased Memory\n\n";print " Address Size Line File VarName\n";print "---------- -------- ------ ------------- -------\n";for ($i=0; $i<=$VarCount; $i++) { if ($Size[$i]>0) { printf ("%10s %8d %6d %-13s %s\n", $VarAddr[$i], $Size[$i], $LineNo[$i], $File[$i], $VarName[$i]); } }print "Number of Check Statements = ", $NumCheck, "\n";print "Number of Detected Errors = ", $NumError, "\n";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -