SEGV compiling this class
minyard@acm.org
minyard@acm.org
Thu Jun 21 14:33:00 GMT 2001
I checked with GDB, it is exactly the same thing as you reported. I
also have a set of classes that reproduce this on x86 and PowerPC.
I'll include them. I also build a stock compiler (without my GC and
threads package) and it had the same problem.
I looked the the except.c code and I think I know what the problem is.
At least I see something kind of obvious :-). If you look at some of
the previous loops in duplicate_eh_regions, they look like:
for (i = 1; i <= ifun_last_region_number; ++i)
{
cur = ifun->eh->region_array[i];
if (!cur || cur->region_number != i)
continue;
n_array[i] = duplicate_eh_region_1 (cur, map);
}
But the one where the exception happens is:
for (i = 1; i <= ifun_last_region_number; ++i)
if (n_array[i]->outer == NULL)
n_array[i]->outer = cur;
In the exeption-causing loop, there is no check for n_array[i] being
null, even though it seems that it is quite possible this is the case
from the previous loop. However, I don't even pretend to pretend I
know what this code is doing. Anyway, I have a small patch that seems
to fix the problem:
--- except.c.old Thu Jun 21 16:30:31 2001
+++ except.c Thu Jun 21 16:30:00 2001
@@ -1448,7 +1448,7 @@
cur->inner = root;
for (i = 1; i <= ifun_last_region_number; ++i)
- if (n_array[i]->outer == NULL)
+ if (n_array[i] && (n_array[i]->outer == NULL))
n_array[i]->outer = cur;
}
else
-Corey
>minyard@acm.org writes:
>>> it works fine on PowerPC.
>>I couldn't reproduce the bug with the trunk and 3.0 on RHL7.1/x86, but
>it crashed on Linux/Alpha with -O, though it seems to be for different
>reasons.
>>./A
public class SymbolInvalidError extends Exception
{
public final static String Revision = "$Revision: 1.1 $";
public SymbolInvalidError(String info) {
super(info);
}
}
public class SymbolTableValueEntry
{
public static final String Revision = "$Revision: 1.10 $";
/* The entry in the name tree for this value. */
private String name;
public byte infoByte;
public Object infoObject;
public String getName() throws SymbolInvalidError
{
return this.name;
}
}
import java.util.Vector;
import SymbolTableValueEntry;
import SymbolInvalidError;
class tester
{
private Vector ignorePacks = new Vector();
private byte ignorePackCurrInfoByte = 1;
private synchronized final boolean inIgnoredPackages(String name)
{
int i;
int length = ignorePacks.size();
String val;
for (i=0; i<length; i++) {
val = (String) ignorePacks.elementAt(i);
if (name.indexOf(val) != -1) {
return true;
}
}
return false;
}
private final void testBranchTrace(SymbolTableValueEntry v)
{
try {
String name = v.getName();
if (((name.charAt(0) == '_') && (! name.startsWith("__Q")))
|| name.startsWith("pthread")
|| name.startsWith("egc")
|| inIgnoredPackages(name))
{
v.infoByte = (byte) -ignorePackCurrInfoByte;
} else {
v.infoByte = ignorePackCurrInfoByte;
}
} catch (SymbolInvalidError e) {
v.infoByte = ignorePackCurrInfoByte;
}
}
}
More information about the Java
mailing list