View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002339 | FSSCP | SEXPs | public | 2010-11-18 10:46 | 2010-11-29 10:28 |
| Reporter | Echelon9 | Assigned To | Echelon9 | ||
| Priority | normal | Severity | crash | Reproducibility | sometimes |
| Status | resolved | Resolution | fixed | ||
| Product Version | 3.6.13 | ||||
| Fixed in Version | 3.6.13 | ||||
| Summary | 0002339: Intermittent crashes in add_sexps | ||||
| Description | Intermittently been experiencing crashes on OS X, with a stack trace as per below. Reason: KERN_INVALID_ADDRESS at address: 0x1b34fff8 0x0031ad55 in add_sexps (n=1850) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/parse/sexp.cpp:3510 3510 if ( Sexp_nodes[CAR(n)].value == SEXP_NAN ) Caused because CAR(1850) resolves to -1; which then crashes when -1 is used as an index into the Sexp_nodes array. (gdb) print Sexp_nodes[1850] $1 = { text = "10", '\0' <repeats 29 times>, op_index = -2, type = 1073741826, subtype = 2, first = -1, rest = 1851, value = -32765, flags = 1 } (gdb) print Sexp_nodes[1850].first $2 = -1 (gdb) print Sexp_nodes[-1] Cannot access memory at address 0x1b34ffc4 Reliably occurs in first mission of Apotheosis from BP:WiH and other missions occasionally. | ||||
| Additional Information | (gdb) bt #0 0x0031ad55 in add_sexps (n=1850) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/parse/sexp.cpp:3510 0000001 0x00301a68 in eval_sexp (cur_node=1849, referenced_node=-1) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/parse/sexp.cpp:17778 0000002 0x002ff998 in eval_sexp (cur_node=1852, referenced_node=-1) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/parse/sexp.cpp:17761 0000003 0x00313159 in sexp_modify_variable (n=1848) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/parse/sexp.cpp:22719 0000004 0x00301ef8 in eval_sexp (cur_node=1847, referenced_node=-1) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/parse/sexp.cpp:17999 0000005 0x0031a0b4 in eval_when (n=1795, use_arguments=0) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/parse/sexp.cpp:7426 0000006 0x0030220c in eval_sexp (cur_node=1791, referenced_node=-1) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/parse/sexp.cpp:18172 0000007 0x001e9d80 in mission_process_event (event=49) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/mission/missiongoals.cpp:913 0000008 0x001eb512 in mission_eval_goals () at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/mission/missiongoals.cpp:1062 0000009 0x00046eb5 in game_simulation_frame () at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/freespace2/freespace.cpp:4226 0000010 0x0004897b in game_frame (paused=0) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/freespace2/freespace.cpp:4663 #11 0x0004900a in game_do_frame () at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/freespace2/freespace.cpp:5098 0000012 0x000491f6 in game_do_state (state=2) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/freespace2/freespace.cpp:6889 0000013 0x000fb52d in gameseq_process_events () at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/gamesequence/gamesequence.cpp:407 0000014 0x00045cb6 in game_main (cmdline=0x2514e00 "") at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/freespace2/freespace.cpp:7465 0000015 0x00045e52 in SDL_main (argc=1, argv=0x200a3e0) at /Users/*/Documents/Coding/fs2open/trunk/fs2_open/projects/Xcode/../../code/freespace2/freespace.cpp:7614 | ||||
| Tags | No tags attached. | ||||
|
|
mission_process_event (event=49) ----- (gdb) print Mission_events[49] $9 = { name = "change to subspace", '\0' <repeats 13 times>, formula = 1791, result = 0, repeat_count = 1, trigger_count = 1, interval = 1, timestamp = 0, score = 0, chain_delay = -1, flags = 0, objective_text = 0x0, objective_key_text = 0x0, count = 0, satisfied_time = 0, born_on_date = 0, team = -1 } eval_sexp (cur_node=1791, referenced_node=-1) ----- (gdb) print Sexp_nodes[1791] $10 = { text = "when", '\0' <repeats 27 times>, op_index = 146, type = 2, subtype = 1, first = -1, rest = 1795, value = 0, flags = 1 } eval_when (n=1795, use_arguments=0) ----- (gdb) print Sexp_nodes[1795] $8 = { text = '\0' <repeats 31 times>, op_index = -2, type = 1, subtype = 0, first = 1792, rest = 1798, value = -32765, flags = 1 } eval_sexp (cur_node=1847, referenced_node=-1) ----- (gdb) print Sexp_nodes[1847] $7 = { text = "modify-variable", '\0' <repeats 16 times>, op_index = 324, type = 2, subtype = 1, first = -1, rest = 1848, value = -32765, flags = 1 } sexp_modify_variable (n=1848) ----- (gdb) print Sexp_nodes[1848] $6 = { text = "10", '\0' <repeats 29 times>, op_index = -2, type = 1073741826, subtype = 2, first = -1, rest = 1852, value = -32765, flags = 1 } eval_sexp (cur_node=1852, referenced_node=-1) ----- (gdb) print Sexp_nodes[1852] $5 = { text = '\0' <repeats 31 times>, op_index = -2, type = 1, subtype = 0, first = 1849, rest = -1, value = -32765, flags = 1 } eval_sexp (cur_node=1849, referenced_node=-1) ----- (gdb) print Sexp_nodes[1849] $4 = { text = "+", '\0' <repeats 30 times>, op_index = 0, type = 2, subtype = 1, first = -1, rest = 1850, value = -32765, flags = 1 } add_sexps (n=1850) ----- (gdb) print Sexp_nodes[1850] $13 = { text = "10", '\0' <repeats 29 times>, op_index = -2, type = 1073741826, subtype = 2, first = -1, rest = 1851, value = -32765, flags = 1 } (gdb) print Sexp_variables[10] $15 = { type = 784, text = "400", '\0' <repeats 28 times>, variable_name = "sunsize", '\0' <repeats 24 times> } |
|
2010-11-21 03:40
|
mantis2239-add_sexps_fix.patch (1,397 bytes)
Index: code/parse/sexp.cpp
===================================================================
--- code/parse/sexp.cpp (revision 6759)
+++ code/parse/sexp.cpp (working copy)
@@ -3500,25 +3500,25 @@
int sum = 0, val;
if (n != -1) {
- if ( CAR(n) != -1)
+ if ( CAR(n) != -1) {
sum = eval_sexp( CAR(n) );
+ // be sure to check for the NAN value when doing arithmetic -- this value should
+ // get propagated to the next highest function.
+ if ( Sexp_nodes[CAR(n)].value == SEXP_NAN )
+ return SEXP_NAN;
+ else if ( Sexp_nodes[CAR(n)].value == SEXP_NAN_FOREVER )
+ return SEXP_NAN_FOREVER;
+ }
else
sum = atoi( CTEXT(n) );
- // be sure to check for the NAN value when doing arithmetic -- this value should
- // get propagated to the next highest function.
- if ( Sexp_nodes[CAR(n)].value == SEXP_NAN )
- return SEXP_NAN;
- else if ( Sexp_nodes[CAR(n)].value == SEXP_NAN_FOREVER )
- return SEXP_NAN_FOREVER;
-
while (CDR(n) != -1) {
val = eval_sexp( CDR(n) );
// be sure to check for the NAN value when doing arithmetic -- this value should
// get propagated to the next highest function.
if ( Sexp_nodes[CDR(n)].value == SEXP_NAN )
return SEXP_NAN;
- else if ( Sexp_nodes[CAR(n)].value == SEXP_NAN_FOREVER )
+ else if ( Sexp_nodes[CDR(n)].value == SEXP_NAN_FOREVER )
return SEXP_NAN_FOREVER;
sum += val;
n = CDR(n);
|
|
|
With assitance from The_E, proposed patch attached. |
|
|
Good catch. I believe this patch will do the job. |
|
|
I'm going to post this on the SCP internal and get a few more eyes over it. As we're patching one of the most fundamental SEXPs (the '+' operator) it could do with some comprehensive testing. |
|
|
Fixed in r6795 |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2010-11-18 10:46 | Echelon9 | New Issue | |
| 2010-11-18 11:05 | Echelon9 | Category | graphics => scripting |
| 2010-11-18 11:05 | Echelon9 | Description Updated | |
| 2010-11-18 11:11 | Echelon9 | Description Updated | |
| 2010-11-20 20:05 | Echelon9 | Summary | Intermittent crashes around ade_obj<vec3d> / std::vector<light*, SCP_vm_allocator<light*> > => Intermittent crashes around sexp_modify_variable, eval_sexp and add_sexps |
| 2010-11-20 20:05 | Echelon9 | Description Updated | |
| 2010-11-20 20:05 | Echelon9 | Additional Information Updated | |
| 2010-11-20 20:08 | Echelon9 | Description Updated | |
| 2010-11-20 20:08 | Echelon9 | Additional Information Updated | |
| 2010-11-20 20:13 | Echelon9 | Note Added: 0012475 | |
| 2010-11-20 20:13 | Echelon9 | Reproducibility | random => sometimes |
| 2010-11-20 20:13 | Echelon9 | Category | scripting => SEXPs |
| 2010-11-20 20:19 | Echelon9 | Note Edited: 0012475 | |
| 2010-11-20 20:21 | Echelon9 | Description Updated | |
| 2010-11-21 03:03 | Echelon9 | Description Updated | |
| 2010-11-21 03:40 | Echelon9 | File Added: mantis2239-add_sexps_fix.patch | |
| 2010-11-21 03:41 | Echelon9 | Note Added: 0012476 | |
| 2010-11-21 03:42 | Echelon9 | Status | new => assigned |
| 2010-11-21 03:42 | Echelon9 | Assigned To | => Echelon9 |
| 2010-11-22 10:04 | Goober5000 | Note Added: 0012481 | |
| 2010-11-22 10:23 | Echelon9 | Note Added: 0012483 | |
| 2010-11-22 11:27 | Echelon9 | Summary | Intermittent crashes around sexp_modify_variable, eval_sexp and add_sexps => Intermittent crashes in add_sexps |
| 2010-11-22 11:27 | Echelon9 | Status | assigned => confirmed |
| 2010-11-29 10:28 | Echelon9 | Note Added: 0012491 | |
| 2010-11-29 10:28 | Echelon9 | Status | confirmed => resolved |
| 2010-11-29 10:28 | Echelon9 | Fixed in Version | => 3.6.13 |
| 2010-11-29 10:28 | Echelon9 | Resolution | open => fixed |