• Corregido: una ocurrencia de una tabla de grupos no tenía almacenamiento propio
MOVE VALUES-1 TO GRP-1 (IN1) escribía un escalar en un slot llamado GRP-1(1), y MOVE ELEM1 (1, 1) TO TEMP leía el slot propio del hijo, que nada había escrito. Una ocurrencia de grupo es ahora las ocurrencias correspondientes de sus ítems subordinados: escribir GRP-1 (2) se distribuye entre ELEM1 (2,1) … ELEM1 (2,4), y leerla concatena exactamente ésas. Sin subíndice, el mismo recorrido entrega al registro 01 que lo engloba los bytes de todas las ocurrencias, de modo que MOVE GRP-TAB1 TO GRP-TAB2 copia una tabla entera en vez de un único slot plantilla.
• Corregido: un literal con signo que abre el siguiente subíndice se leía como una suma
MOVE ELEM1 (IN1 +3) TO TEMP es ELEM1 (IN1, 3): la coma separadora es opcional, y un signo pegado a sus dígitos es un literal con signo. Se leía como IN1 + 3, un solo subíndice, que caía en una ocurrencia que nunca se había escrito. La indexación relativa — ELEM1 (IN1 - 1, 3), con el operador espaciado por ambos lados — no cambia, y tampoco TBL (I+1), donde el signo está pegado por ambos lados y los programas ya escritos así significan aritmética.
• Corregido: un MOVE numérico no truncaba los dígitos de orden alto
01 M PIC 99V999. MOVE 123.45 TO M. dejaba 123.450. El extremo de orden bajo ya se recortaba con el reescalado; el extremo de orden alto se trunca con el mismo silencio según el estándar, y ahora se hace. La aritmética sigue comprobando la capacidad del receptor antes de almacenar, de modo que una sentencia con ON SIZE ERROR conserva su valor anterior y una sentencia sin ella trunca.
• Corregido: las posiciones de escalado decimal P se ignoraban
PIC S999PP contiene tres dígitos que representan centenas y PIC PP99 dos que representan diezmilésimas: P es una posición de dígito que el ítem abarca pero no almacena. Se omitía por completo, así que MOVE 12300 TO IF-D15 almacenaba 300 una vez en vigor el truncado, y ADD … GIVING N-42 sobre PIC 9(3)P(4) daba 8888888 donde el estándar exige 8880000. El escalado ahora cuenta para la capacidad del ítem y para su escala, y las posiciones que las P representan se leen como cero. El trazado del registro no cambia — esas posiciones no ocupan bytes.
• Corregido: REDEFINES era una copia única, no una superposición viva
Una escritura a través de una descripción era invisible a través de la otra, y un ítem redefinidor se contaba en los bytes de su grupo, dejando el grupo el doble de ancho que su almacenamiento. Las descripciones que comparten bytes ahora se mantienen sincronizadas: una escritura en cualquier punto de una se vuelve a renderizar en las demás, y sólo el destino contribuye al ancho del grupo. Sobre esto se construye cada detalle de fallo de CCVS (COMPUTED-N REDEFINES COMPUTED-A, impreso a través del grupo que los engloba). Las superposiciones de más de 256 slots de almacenamiento expandidos conservan el antiguo almacenamiento por descripción — refrescar una tabla redefinida de 10×10×10 en cada escritura recorre mil ocurrencias dos veces y hacía el programa inejecutable.
• Corregido: DIVIDE entre cero abortaba la ejecución
La división entre cero es la condición de error de tamaño para DIVIDE. Ahora ejecuta ON SIZE ERROR cuando lo hay, suprime NOT ON SIZE ERROR en ambos casos y deja los receptores intactos. Abortar, en cambio, terminaba el programa a mitad del informe; NC251A prueba exactamente esto y no imprimía nada en absoluto.
• Corregido: una descripción redefinidora más ancha que su destino provocaba un pánico
deserialize_decl acotaba sólo el final de su ventana de bytes, de modo que un cursor situado más allá del final del almacenamiento producía start > end y el slice entraba en pánico (range start index 58 out of range for slice of length 57).
• Corregido: gramática que el Nucleus escribe y el parser rechazaba
- ALTER es una serie: ALTER a TO PROCEED TO b, c TO PROCEED TO d parseaba un solo par. Los pares extra se encolan, con lo que Stmt::Alter sigue siendo un único par y el AST serializado queda intacto; los destinos pasan por el lector de nombres de procedimiento, así que funcionan los nombres de sólo dígitos.
- El GO TO alterado: GO TO. sin destino parsea, cae al párrafo siguiente mientras no está alterado, y salta en cuanto un ALTER nombra un destino.
- Los nombres de procedimiento de sólo dígitos conservan sus ceros iniciales: 00001 y 000001 son párrafos distintos; ambos se convertían en 1 y colisionaban.
- Una condición que no es un identificador simple: un nombre de condición puede ir subindicado (IF FIRSTZ (1)) o cualificado (IF A OF IF-D32); los subíndices seleccionan la ocurrencia del ítem anfitrión contra la que se prueban los VALUE.
- Un operando aritmético entre paréntesis: UNTIL (WRK + 12) = 100 y WHEN (33 + (99 - 43)) se leían como condiciones anidadas.
- Objetos de WHEN: una expresión aritmética, y un rango entre dos ítems de datos (WHEN WRK-A THRU WRK-B), son ahora objetos de selección.
- GREATER THAN OR EQUAL TO: el OR EQUAL puede situarse a cualquiera de los dos lados del THAN opcional.
- Relaciones combinadas abreviadas: un literal seguido de un operador relacional es un sujeto, no un objeto de abreviatura; el objeto puede ser una expresión aritmética (OR CCON-3 - 1) o una prueba de clase o de signo (AND SIGN-1 ZERO); AND IS NOT LESS THAN x conserva su IS opcional; NOT < tras OR es una abreviatura; y el sujeto que una abreviatura reutiliza puede estar más a la izquierda que el término al que se une (a = b OR c AND "d").
- Ligadura de ELSE: un imperativo de ON SIZE ERROR y la rama ELSE propia de un IF anidado se detienen ambos en el ELSE / END-IF / WHEN / END-PERFORM / END-SEARCH de la sentencia que los engloba.
- Serie de receptores de MULTIPLY / DIVIDE formato 1: MULTIPLY a BY b ROUNDED c ROUNDED d — cada receptor se multiplica por su propio valor actual, así que se encolan como sentencias separadas en lugar de plegarse en GIVING.
- Orden de frases y formas de PERFORM: WITH TEST BEFORE puede preceder a VARYING; el contador de repeticiones puede ser un ítem subindicado (PERFORM P TABLE5-NUM (INDEX5) TIMES); PERFORM imperativo … END-PERFORM sin frase alguna ejecuta su cuerpo una vez; un nombre de párrafo puede cualificarse por su sección (PERFORM PAR-1A OF QUAL-SECTION-1).
- INSPECT: la categoría ALL/LEADING/TRAILING se propaga a los operandos que la siguen; CONVERTING … BEFORE/AFTER INITIAL restringe la región convertida.
- UNSTRING: TALLYING IN se acepta después de WITH POINTER, que es el orden en que lo escribe el estándar.
- Un ítem RENAMES de nivel 66 como receptor aritmético: no tiene PICTURE propio, así que su categoría es desconocida y no no-numérica, y ADD 3500 TO RENAME-12 ya no se rechaza.
=== PowerRustCOBOL 1.62.22 — 2026-08-27 ===
NIST CCVS85 Nucleus (NC): compilación 92 -> 93 de 95, ejecución 28 -> 36 de 95. Dos números separados, siempre. La compilación cuenta los programas que el front end acepta; la ejecución cuenta los programas que corren hasta el final e informan cero fallos en su propio informe CCVS. Las aserciones que los propios programas informan pasaron de 3 302 PASS / 727 FAIL a 3 915 PASS / 540 FAIL — el 87.9 % de 4 455 puntuadas. Ningún otro módulo fue tocado (GOLDEN RULE #9).
• Corregido: una frase condicional se tragaba el resto del párrafo
ON SIZE ERROR, AT END, INVALID KEY, ON OVERFLOW, ON EXCEPTION y todos los demás imperativos condicionales leían de largo el punto que termina la oración, de modo que cada oración siguiente pasaba a formar parte de la frase y se ejecutaba sólo cuando la condición se disparaba:
Código:
DIVIDE A INTO B GIVING C ON SIZE ERROR MOVE "P" TO XRAY.
DISPLAY XRAY.
El DISPLAY — y todo lo que le sigue — sólo se ejecutaba ante un error de tamaño. Un cuerpo con ámbito ahora termina en el punto, que es donde COBOL-85 lo termina; el cuerpo de un párrafo sigue leyendo tantas oraciones como quiera. TRY … CATCH … END-TRY encierra oraciones, no un imperativo, y no cambia.
• Corregido: DIVIDE a INTO b dividía en el sentido equivocado
BY e INTO nombran sus operandos en órdenes opuestos — DIVIDE dividendo BY divisor pero DIVIDE divisor INTO dividendo — y sólo BY se respetaba. Así, DIVIDE 5 INTO 20 GIVING C almacenaba 0.25, y en la forma con receptor DIVIDE 5 INTO B intentaba almacenar el cociente en el literal 5 y dejaba B intacto. Una serie de receptores ahora divide cada receptor entre el divisor: DIVIDE 2 INTO A B reduce ambos a la mitad.
• Corregido: REMAINDER usaba el cociente entero
COBOL-85 calcula el resto a partir del cociente tal como queda almacenado en el receptor de GIVING — truncado al PICTURE de ese ítem, y truncado incluso cuando el propio cociente llevaba ROUNDED. DIVIDE 7 INTO 23 GIVING C REMAINDER R con C PIC 999V99 da C = 3.28 y R = 0.04, no R = 2.00.
• Corregido: todos los registros 01 de un mismo FD tenían almacenamiento separado
Un FD tiene una sola área de registro por muchas entradas 01 que la describan. Cada una conservaba sus propios bytes, así que un valor movido a través de un registro era invisible a través de otro. Cada programa CCVS85 construye su línea de informe en PRINT-REC y la escribe como DUMMY-RECORD: todos los encabezados de página salían en blanco, y el bloque de salto de página escribía la línea retenida una vez por sentencia en lugar de una sola vez — seis copias idénticas de la misma línea de detalle, que es lo que empujó a varios programas más allá del tiempo límite de ejecución.
• Corregido: PERFORM <section-name> no ejecutaba nada
Un encabezado de sección no lleva sentencias propias; es los párrafos que lo siguen, hasta el siguiente encabezado. PERFORM encontraba la entrada vacía del encabezado y retornaba de inmediato. Las secciones ahora se expanden a su rango de párrafos, THRU con un nombre de sección termina en el último párrafo de esa sección, y el rango conserva la identidad de los párrafos, de modo que un GO TO dentro de él permanece dentro.
• Corregido: la cualificación se detenía tras un nivel
A OF B OF C conservaba sólo el último cualificador: la cadena creciente se colocaba donde sólo cabe un nombre simple, y todos los niveles menos uno se descartaban. Ahora se resuelven hasta los 49 niveles del estándar, de modo que TBL-ITEM-1 OF TABLE-LEVEL-1A IN TABLE-LEVEL-2A OF TABLE-LEVEL-3A alcanza el ítem que nombra y no el duplicado que se declaró primero. Un subíndice escrito antes de los cualificadores (TBL-ITEM (I) OF GRP) se conserva.
• Corregido: las cláusulas VALUE de nivel 88 perdían el resto de la DATA DIVISION
Cuatro defectos en una sola cláusula, cada uno de los cuales desincronizaba el parser y descartaba en silencio todas las entradas posteriores: VALUES ARE 2 THRU 4 — la cópula en plural no se aceptaba; VALUE IS +12.34 y VALUE 100 THRU 128 -9 THRU -2 — un signo inicial no se plegaba en el literal; VALUE IS .01, .11, .21 — un punto que abre un literal numérico se leía como el fin de la entrada (COBOL-85 sólo prohíbe el punto decimal final); y un valor que abre una línea (16 THRU 20 continuado de la línea anterior) se tomaba por el número de nivel de la entrada siguiente.
• Corregido: PIC 999999999999.. perdía su punto decimal de edición
Dos puntos seguidos: el primero pertenece a la imagen, el segundo termina la entrada. Ambos se leían como terminadores, lo que costaba a la plantilla su punto decimal y dejaba un punto suelto que desincronizaba la DATA DIVISION.
• Corregido: ROUNDED no redondeaba hacia un receptor de edición numérica
La escala del receptor se leía del valor que casualmente contenía, y un ítem de edición numérica contiene caracteres editados. MULTIPLY .9 BY 80.12 GIVING <PIC $$$$.99> ROUNDED editaba el $72.10 truncado en lugar de $72.11. La escala ahora procede del PICTURE.
• Corregido: ADD/SUBTRACT CORRESPONDING ignoraban ON SIZE ERROR y ROUNDED
Ambas frases se parseaban y se descartaban. La condición de error de tamaño pertenece a la sentencia, no a una pareja: un receptor que desborda queda sin cambios, los demás siguen recibiendo sus resultados, y el único imperativo se ejecuta una sola vez.
• Corregido: una condición entre paréntesis redundantes se leía como aritmética
Sólo el nivel de anidamiento más externo se inspeccionaba en busca de un operador relacional o lógico, así que ((((((0 - CONT-D EQUAL TO CONT-D OR -11 + CONT-F)))))) se tomaba por una única expresión aritmética. Ahora también se acepta una relación abreviada cuyo objeto es una expresión aritmética que abre con un signo (… EQUAL TO CONT-D OR -11 + CONT-F).
• Añadido: nist_conformance fails <MODULE|NAME>
Una tercera pasada junto a strict y run: ejecuta cada programa e imprime los registros de detalle FAIL* que lleva su propio informe, con la pareja COMPUTED= / CORRECT = que nombra el defecto. Agrupar esos detalles por causa a lo largo de un módulo es como se encontraron las causas compartidas de arriba — el detalle de un programa es una anécdota; el de cuarenta programas, una categoría.
=== PowerRustCOBOL 1.62.23 — 2026-08-27 ===
NIST CCVS85 Nucleus (NC): compilación 93 -> 94 de 95, ejecución 36 -> 65 de 95. Dos números separados, siempre. La compilación cuenta los programas que el front end acepta; la ejecución cuenta los programas que corren hasta el final e informan cero fallos en su propio informe CCVS. Las aserciones que los propios programas informan pasaron de 3 915 PASS / 540 FAIL a 4 278 PASS / 226 FAIL. La compilación del conjunto completo queda ahora en 419 / 434. Ningún otro módulo fue tocado (GOLDEN RULE #9).
Veintinueve programas CCVS pasaron de fallar a limpios, entre ellos NC102A, NC106A, NC114M, NC119A, NC120A, NC124A, NC126A, NC170A, NC174A, NC176A, NC177A, NC203A, NC215A, NC218A, NC222A, NC224A, NC236A, NC238A, NC242A, NC243A, NC251A, NC253A y NC254A.
• Corregido: NOT ON SIZE ERROR por sí solo no protegía los receptores
COBOL-85 deja un receptor sin cambios cuando desborda y la sentencia lleva una frase de error de tamaño — cualquiera de sus dos mitades. Sólo se comprobaba ON SIZE ERROR, de modo que
Código:
ADD A B 6 C GIVING R1 R2 ROUNDED R3 NOT ON SIZE ERROR MOVE "A" TO FLAG.
escribía valores truncados en cada receptor que desbordaba en lugar de dejarlos en paz. Una regla, seis sentencias (ADD, SUBTRACT, MULTIPLY, DIVIDE, COMPUTE, las formas CORRESPONDING) — y seis programas CCVS.
• Corregido: un nombre de párrafo duplicado ejecutaba las sentencias del otro
Los cuerpos de los párrafos se indexaban por nombre, de modo que un segundo PFM-INIT-F2-5. sobrescribía las sentencias del primero mientras el primero conservaba su lugar en el programa. El primer párrafo ejecutaba entonces en silencio el código del segundo. Los cuerpos se mantienen ahora por posición para el flujo secuencial y los rangos THRU, y el índice de nombres conserva la primera definición para las búsquedas.
• Corregido: UNSTRING ignoraba la mayor parte de su propia sentencia
DELIMITER IN, COUNT IN, WITH POINTER y TALLYING se parseaban y luego se descartaban, y el origen se partía con str::split en lugar de escanearse. DELIMITER (la palabra de DELIMITER IN) no es la palabra clave DELIMITED, así que la frase se leía como otro ítem receptor más. UNSTRING ahora escanea desde el puntero, entrega una sola ocurrencia de delimitador bajo ALL, parte por los tamaños propios de los receptores cuando no se escribe DELIMITED BY, distribuye dentro de un receptor de grupo, e informa desbordamiento cuando los receptores se agotan antes que el origen.
• Corregido: edición numérica
- Una imagen cuyas posiciones de dígito están todas suprimidas deja en blanco el ítem entero cuando el valor es cero, punto decimal incluido: PIC ZZZ.ZZ y PIC ++++.++ se leen como espacios, PIC *,***.** como *****.**.
- Los símbolos de inserción flotante situados después del punto decimal son posiciones de dígito: PIC ++++.++ con 12 se lee " +12.00", no " +12.++".
- El símbolo flotante se sitúa inmediatamente a la izquierda del primer dígito mostrado, contado en posiciones de carácter — una coma de agrupación intermedia toma el signo, así que PIC --,---.-- con -123 se lee " -123.00".
- Un carácter de inserción simple dentro de la zona de supresión se sustituye por el carácter de supresión: PIC -*B*99 con -42 se lee -***42.
- Las posiciones de escalado P en un ítem editado reducen el valor a los dígitos que almacena: PIC ZZZPP que recibe 900 se lee " 9".
- PIC 090909 conserva ahora su cero inicial. El lexer había leído la plantilla como un número, así que la imagen salía un carácter más estrecha de lo que es.
• Corregido: MOVE
- Un grupo rellenado con una constante figurativa se rellena entero. MOVE ZERO TO <grupo> establecía sólo el primer campo y dejaba el resto como estaba, y MOVE ALL "ABC…" TO <tabla de 7 dimensiones> rellenaba la primera ocurrencia del OCCURS más externo.
- Des-edición: un emisor de edición numérica movido a un receptor numérico transfiere el valor que sus caracteres deletrean. PIC $(4)9.99CR con "$ 123.45CR" almacena -123.45.
- Un emisor numérico subindicado, cualificado o literal se des-edita como cualquier otro: MOVE FIELD (I) TO <PIC X(4)> y MOVE 2 TO <PIC X(4)> alinean a la izquierda.
- Un ítem numérico sin signo almacena el valor absoluto: PIC 9(18) que recibe un producto negativo contiene su magnitud.
- ROUNDED hacia un ítem con posiciones P redondea a esa posición: PIC S99P que recibe -99 contiene -100.
• Corregido: la modificación de referencia sobre un elemento de tabla
TABLE-1 (3 2) (2:5) leía el slot base de la tabla en lugar de la ocurrencia (3, 2), así que todo elemento de tabla con modificación de referencia volvía vacío.
• Corregido: DIVIDE … REMAINDER
El resto se forma después de que el cociente llega a su receptor, de modo que el propio subíndice del receptor del resto ve el cociente nuevo (DIVIDE 100 BY N GIVING ANS REMAINDER WS-REM (ANS)), y el cociente se trunca al PICTURE del ítem de GIVING incluso cuando ese ítem es de edición numérica.
• Corregido: INSPECT … LEADING / TRAILING
Ambos contaban caracteres que aparecen en el patrón en lugar de ocurrencias contiguas del patrón completo, así que FOR LEADING "AH" sobre "AH YES AH YES" contaba 2. REPLACING LEADING además reexaminaba la misma posición tras cada sustitución y no terminaba nunca cuando BY era igual al patrón.
• Añadido: JUSTIFIED RIGHT
Hasta ahora se parseaba y se ignoraba. Un receptor alfanumérico declarado JUSTIFIED alinea el emisor en su extremo derecho: un emisor corto se rellena por la izquierda y uno largo pierde sus caracteres más a la izquierda.
• Añadido: PICTURE alfanuméricos de edición
PIC XXBXX/XX, PIC ABA y PIC A/AA poseen sus caracteres de inserción: B imprime un espacio, 0 un cero, / una barra, y el emisor aporta sólo las posiciones X/A/9. PIC ABA además se medía como dos caracteres de ancho en lugar de tres.
• Añadido: switches de SPECIAL-NAMES y clases definidas por el usuario
Código:
SPECIAL-NAMES.
SWITCH-1 IS SW-1 ON STATUS IS ON-SWITCH-1
OFF STATUS IS OFF-SWITCH-1
CLASS ORDINAL-A-D IS "A" THRU "D".
SET SW-1 TO ON, IF ON-SWITCH-1 e IF ITEM IS [NOT] ORDINAL-A-D funcionan todos. Un switch se establece desde fuera del programa — rcrun --switch SWITCH-1=ON (repetible) o COBOL_SWITCHES=SWITCH-1=ON,SWITCH-2=OFF — porque nada dentro de COBOL puede establecer uno antes de que empiece la ejecución.
• Corregido: PERFORM paragraph OF section ignoraba el cualificador
El cualificador de sección OF/IN se consumía y se descartaba, de modo que un nombre de párrafo repetido entre secciones ejecutaba siempre la primera definición del programa. Ahora selecciona la copia que está dentro de la sección nombrada. (GO TO paragraph IN section aún resuelve sin cualificar — véase la nota de traspaso.)
• Corregido: un receptor de edición numérica no podía provocar un error de tamaño
Un ítem editado contiene sus caracteres editados, así que no conserva entrada de capacidad y la condición de error de tamaño no podía surgir nunca para él: MULTIPLY 999999 BY 999999 GIVING <PIC $**.99> … ON SIZE ERROR … truncaba el producto dentro del campo en lugar de dejarlo intacto. Su capacidad procede ahora de las posiciones de dígito de la plantilla, exactamente igual que ya lo hacía su escala.
• Corregido: SEARCH … VARYING conducía el índice equivocado
VARYING id-2 sustituye al índice de búsqueda sólo cuando id-2 es un índice de esa misma tabla. En caso contrario, el primer índice propio de la tabla sigue conduciendo la búsqueda e id-2 se avanza en paralelo. Buscar siempre sobre id-2 dejaba el índice de la tabla donde empezó, así que un WHEN que subindicaba con ese índice nunca avanzaba y la búsqueda llegaba siempre a AT END.
• Añadido: nist_conformance report <NAME>
Imprime el informe CCVS completo de un programa, repartido de nuevo en sus registros de 120 bytes. fails muestra sólo el entorno de un FAIL*, lo que basta para agrupar una causa a lo largo de un módulo pero no para diagnosticar un programa.
=== PowerRustCOBOL 1.62.24 — 2026-08-27 ===
NIST CCVS85 Nucleus (NC): ejecución 65 -> 66 de 95, aserciones 226 -> 191 fallando. La compilación se mantiene en 94 / 95. Dos números separados, siempre — la compilación cuenta los programas que el front end acepta, la ejecución cuenta los programas que corren hasta el final e informan cero fallos en su propio informe CCVS. NC116A pasó de 23 fallos a limpio; NC252A pasó de 17 a 11 y NC217A de 11 a 5. Ningún otro módulo fue tocado (GOLDEN RULE #9).
• Corregido: SIGN IS … SEPARATE CHARACTER no cambiaba el almacenamiento
La cláusula se parseaba y se descartaba, de modo que PIC S9(5) SIGN IS LEADING SEPARATE ocupaba cinco caracteres en lugar de seis y nunca contenía el + o el - para el que la declaración reserva una posición. Un signo separado es una posición de almacenamiento que siempre está ocupada: MOVE 15759 TO un ítem así almacena ahora +15759, y MOVE -15759 almacena -15759, con el signo delante para LEADING y detrás para TRAILING. Escrita sobre un grupo, la cláusula alcanza a todo ítem DISPLAY numérico con signo subordinado que no lleve una propia, y un grupo anidado la redefine para su propio subárbol.
Un signo embebido (no SEPARATE) no cambia: el ítem sigue midiendo exactamente sus posiciones de dígito, que es lo que el overpunch definido por el implementador que fija el estándar deja observable.
DataDecl ganó un campo sign y cobolt_ast::data::SignClause es nuevo — ambos al final de sus declaraciones, según la regla de ordinales de bincode.
• Corregido: un REDEFINES subordinado se serializaba como almacenamiento extra
Dentro de un grupo, una entrada REDEFINES es otra lectura de los bytes de su hermano, no más bytes. El constructor de imágenes de REDEFINES la emitía además, así que cada campo posterior se desplazaba: 02 RDF3 REDEFINES RDFDATA3 insertaba una segunda copia de ALLDONXX66 en el registro, y la superposición de 36 elementos situada encima leía desplazada once bytes. El serializador ahora omite los hijos redefinidores, y el deserializador los rellena desde donde empezó su destino en lugar de desde los bytes que siguen.