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)