#1 An infinite loop can occur in subroutine "quote_highlight"

open
nobody
None
5
2000-10-10
2000-10-10
Anonymous
No

For some reason, an infinite loop occurs during certain searches. It seems to happen for certain symbols only,
but it happens every time the offending symbol is searched for as long as the type criteria ("symbol", "global",
"called by", "calling", etc.) is the same.

I've found that I can circumvent this infinite loop by adding the variable "failsafe" to the "quote_highlight"
subroutine, and quitting if it gets too big:

proc quote_highlight { widget } {

set pattern {[^\\']\"}

# Look in between commented regions for quotes
foreach {start end} [concat 1.0 [$widget tag ranges comment] end] {

#
# Do this to avert the "infinite loop bug". 001004 -- jcn
#
set failsafe 0

while {[set temp [$widget search -regexp -- $pattern $start $end]] != ""} {

#
# Do this to avert the "infinite loop bug". 001004 -- jcn
#
set failsafe [expr $failsafe + 1]
if { $failsafe > 1024 } {
puts "Avoided infinite loop in cbrowser!"
return;
}

set endquote [$widget search -regexp -- {[^\\]\"} "$temp + 1chars" $end]

if {[strlen $endquote] > 0} {
set start [$widget index "$endquote + 2chars"]

$widget tag add quote "$temp + 1chars" $start
}
}
}
}

Discussion

  • Charles Slater
    Charles Slater
    2003-01-27

    Logged In: YES
    user_id=698273

    Thanks for reporting this bug and fix. I think that this
    infinite loop is very common. People may be browsing a
    mixture of C and python or C files with an error in a quoted
    string statement. The fix is fine. The variable
    "failsafe" could be changed to "lines_in_quote". cbrowser
    can have
    a specified limit of 1024 on the number of line inside a
    highlighted quote.

    There may be better fixes, but this one beats an infinite
    loop. I vote for adding it to the distribution.