This is the mail archive of the
java-prs@sources.redhat.com
mailing list for the Java project.
gcj/345: recursion stress test causes segmentation fault
- To: java-gnats at sourceware dot cygnus dot com
- Subject: gcj/345: recursion stress test causes segmentation fault
- From: osk at hem dot passagen dot se
- Date: 12 Sep 2000 10:49:27 -0000
- Reply-To: osk at hem dot passagen dot se
- Resent-Cc: java-prs at sourceware dot cygnus dot com, green at cygnus dot com
- Resent-Reply-To: java-gnats@sourceware.cygnus.com, osk@hem.passagen.se
>Number: 345
>Category: gcj
>Synopsis: recursion stress test causes segmentation fault
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: apbianco
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Tue Sep 12 03:50:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: Oskar Liljeblad
>Release: unknown-1.0
>Organization:
>Environment:
gcc/gcj 2.96 20000904
>Description:
According to the Java VM specs, §3.5.2, the vm should
throw StackOverflowError or OutOfMemoryError when the
stack is full or there's no more memory for the dynamic
stack. GCJ doesn't do this.
Consider the test program below. Here's the result of
running it in some different x86 environments:
gcj (gcj -o recurse --main=recurse recurse.java)
Segmentation fault after >40000, <50000 recursions
Blackdown JDK 1.2.2
Segmentation fault after >40000, <50000 recursions
gcj -O2
Never exists - infinite recursion due to tail recursion optimization
IBM JDK 1.1.8
Never exists - infinite recursion due to tail recursion optimization
IBM JDK 1.3.0
Never exists - infinite recursion due to tail recursion optimization
IBM JDK 1.1.8 -nojit
StackOverflowException with very long stack trace (>9000 lines)
gij
Segmentation fault after >2000, <3000 recursions
>How-To-Repeat:
import java.util.Vector;
public class recurse {
public static void main(String[] args) {
recurse(0);
}
public static void recurse(int level) {
if (level < 10000) {
if (level % 1000 == 0)
System.out.println(level);
} else if (level < 100000) {
if (level % 10000 == 0)
System.out.println(level);
} else if (level % 100000 == 0) {
System.out.println(level);
}
recurse(level+1);
}
}
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted: