View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0000503 | LDMud 3.3 | Runtime | public | 2007-04-25 17:02 | 2018-01-29 21:57 |
| Reporter | zesstra | Assigned To | |||
| Priority | normal | Severity | major | Reproducibility | always |
| Status | resolved | Resolution | fixed | ||
| Product Version | 3.3.713 | ||||
| Fixed in Version | 3.3.716 | ||||
| Summary | 0000503: foreach() with negative integer expression causes "endless" loop | ||||
| Description | foreach(int i: -1) printf("%O",i); loops as long as there are evaluation ticks left: "...6503186504186505186506186507186508186509186510186511186512186513186514186515186516186517186518186519186520186521186522186523186524186525186526186527186528186529186530186531186532186533186534186535186536186537186538186539186540186541Error: Too long evaluation. Execution aborted." | ||||
| Additional Information | I will probably look into the source during the next days and try to write a suitable patch. | ||||
| Tags | No tags attached. | ||||
| Attached Files | foreach.patch (446 bytes)
--- ldmud-3.3.714.orig/src/interpret.c 2006-07-10 04:44:33.000000000 +0200
+++ ldmud-3.3.714/src/interpret.c 2007-04-29 23:33:15.000000000 +0200
@@ -15165,6 +15165,8 @@
if (arg->type == T_NUMBER)
{
count = arg->u.number;
+ if (count<0)
+ ERRORF(("foreach() got %ld, expected a positive integer.\n",count));
vars_required = 1;
}
else if (arg->type == T_STRING)
foreach2.patch (460 bytes)
--- ldmud-3.3.714.orig/src/interpret.c 2006-07-10 04:44:33.000000000 +0200
+++ ldmud-3.3.714/src/interpret.c 2007-04-29 23:55:34.000000000 +0200
@@ -15165,6 +15165,8 @@
if (arg->type == T_NUMBER)
{
count = arg->u.number;
+ if (count<0 && !use_range)
+ ERRORF(("foreach() got %ld, expected a positive integer.\n",count));
vars_required = 1;
}
else if (arg->type == T_STRING)
| ||||
|
|
Ok, this is a tiny patch for interpret.c which just checks 'count' in CASE(F_FOREACH) if the argument is of type T_NUMBER. If 'count' is negative, it throws an error via ERRORF(). One could argue that the original behaviour is not a bug and just a possibility to iterate over a larger integer range than 0 - MAX_INT. But I think, that isn't a very realistic scenario. Most often, a negative integer as range expression is just not intended and therefore I would prefer to not accept it. BTW: Another possibility is to silently correct a negative 'count' to 0 and only issue a warning, but I would definitely prefer a real error as this situation anyway leads to a 'too long evalution' error. |
|
|
Yup, makes sense. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2007-04-25 17:02 | zesstra | New Issue | |
| 2007-04-29 15:36 | zesstra | File Added: foreach.patch | |
| 2007-04-29 15:47 | zesstra | Note Added: 0000531 | |
| 2007-04-29 16:01 | zesstra | File Added: foreach2.patch | |
| 2007-10-06 22:40 |
|
Status | new => resolved |
| 2007-10-06 22:40 |
|
Fixed in Version | => 3.3.716 |
| 2007-10-06 22:40 |
|
Resolution | open => fixed |
| 2007-10-06 22:40 |
|
Assigned To | => lars |
| 2007-10-06 22:40 |
|
Note Added: 0000560 | |
| 2010-11-16 09:42 |
|
Source_changeset_attached | => ldmud.git master 3bf94a56 |
| 2018-01-29 18:59 |
|
Source_changeset_attached | => ldmud.git master 3bf94a56 |
| 2018-01-29 21:57 |
|
Source_changeset_attached | => ldmud.git master 3bf94a56 |