Menu

#4363 [format %llx] overflow

obsolete: 8.5.7
closed-fixed
5
2009-06-10
2009-06-04
Don Porter
No

% set x [expr {1<<(2**29)}]; concat
% set x [expr {$x<<(2**29)}]; concat
% set x [expr {$x<<(2**29)}]; concat
% set x [expr {$x<<(2**29)}]; concat
% incr x -1; concat
% set s [format %#llx $x]; concat
Tcl_SetObjLength: negative length requested: -536870912 (integer overflow?)

Computing the value of numDigits overflows
the int range.

Discussion

  • Don Porter

    Don Porter - 2009-06-05

    After applying attached patch:

    % set max [expr {(1<<(2**31-3)<<(2**31-3)<<(2**31-3)<<(2**31-3))-1}]; concat
    % set s [format %#llx $max]; concat
    % string length $s
    2147483647
    % incr max; concat
    % set s [format %#llx $max]; concat
    max size for a Tcl value (2147483647 bytes) exceeded

    This demos ability of [format] to create a numeric
    string up to Tcl's limits.

    A panic when those limits are exceeded is a bit
    jarring, but that's a separate bug/misfeature.

     
  • Don Porter

    Don Porter - 2009-06-10
     
  • Don Porter

    Don Porter - 2009-06-10

    Updated patch also converts all
    [format] panics due to string length
    overflow into simple Tcl errors.

     
  • Don Porter

    Don Porter - 2009-06-10

    patch committed for 8.5.8 and 8.6b2.

     
  • Don Porter

    Don Porter - 2009-06-10
    • status: open --> closed-fixed