HaxeFoundation / HaxeFoundation/hashlink

ObjectMap's `find` method can get stuck in an infinite loop.

Open
#745 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
901
Forks
201
Avg merge
18h 9m
Merged PRs (30d)
8

Description

Part of my engine uses a Map to keep track of calls for a certain function.
```haxe
var list: Array;
var firstUpdates: Map;

function ME_StartCheck(): Void {
for (comp in list) {
if (!comp.Enabled) continue;
if (firstUpdates[comp]) continue;
comp.OnStart();
firstUpdates[comp] = true;
}
}
```

After enough calls the `find` method gets caught in an infinite loop thanks to `ckey` starting as zero and `_MNEXT(m,c)` also returning zero.
```cpp
_MSTATIC _MVAL_TYPE *_MNAME(find)( t_map *m, t_key key ) {
int c, ckey;
unsigned int hash;

if( !m->values ) return NULL;
hash = _MNAME(hash)(key);
ckey = hash % ((unsigned)m->ncells);
c = _MINDEX(m,ckey);
while( c >= 0 ) {
if( _MMATCH(c) )
return &m->values[c].value;
c = _MNEXT(m,c);
}
return NULL;
}
```

I'm not familiar enough with HashLink to come to a conclusion on how this happens. But the objects I store in the map are never iterated over or constantly changing. The map also isn't created in C, it is only interacted with via Haxe code.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.