https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119914

            Bug ID: 119914
           Summary: Passing a constant to the unbounded array compiles and
                    causes a.out to dump core
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: modula2
          Assignee: gaius at gcc dot gnu.org
          Reporter: gaius at gcc dot gnu.org
  Target Milestone: ---

Forwarded from the gm2 mailing list:

Passing an INTEGER or CARDINAL literal to one of the
Sprintf* functions the program to dump core.

How to reproduce:
============================ formatting.mod =====================
MODULE Hello;

FROM Terminal IMPORT Write, WriteLn;
FROM FormatStrings IMPORT Sprintf0, Sprintf1, Sprintf2;
FROM DynamicStrings IMPORT String, InitString, Length, char;

(* Like Terminal.WriteString, except that it takes a String, not an ARRAY OF 
CHAR. *)

PROCEDURE WriteString (s: String);
VAR
  l, i: CARDINAL;
BEGIN
  l := Length(s);
  i := 0;
  WHILE i < l DO
    Write(char(s, i));
    INC (i);
  END;
END WriteString;

VAR i:INTEGER;
    c:CARDINAL;

BEGIN

  WriteString(InitString("Hello, world!"));
  WriteLn;
  WriteString(Sprintf0(InitString("abc\n")));
  WriteLn;
  WriteString(Sprintf1(InitString("abc%%def\n"), "Foo"));
  WriteLn;
  WriteString(Sprintf1(InitString("abc%-0r\n"), "Foo")); (* => "abcr". Invalid 
directive silently ignored. *)
  WriteLn;
  WriteString(Sprintf1(InitString("abc%s\n"), InitString("Foo")));
  WriteLn;
  WriteString(Sprintf1(InitString("abc%c\n"), CHR(42)));
  WriteLn;
  i := -42;
  WriteString(Sprintf1(InitString("abc%d\n"), i));
  WriteLn;
  (* Dumps core:
  WriteString(Sprintf1(InitString("abc%d\n"), -42));
  *)
  c := 42;
  WriteString(Sprintf1(InitString("abc%u\n"), c));
  WriteLn;
  (* Dumps core:
  WriteString(Sprintf1(InitString("abc%u\n"), 42));
  *)
  WriteString(Sprintf1(InitString("abc%x\n"), c));
  WriteLn;
  (* Dumps core:
  WriteString(Sprintf1(InitString("abc%x\n"), 42));
  *)

END Hello.
==================================================================
Enable one of the three WriteString lines that are commented out.
$ gm2 formatting.mod && ./a.out
RTExceptions.mod:650:35: In invalidloc
RTExceptions.mod:650:35:invalid address referenced
Hello, world!
abc

abc%def

abcr

abcFoo

abc*

abc-42

abc42

abc2a

Aborted (core dumped)

Reply via email to