diff options
author | Sierra A <6080951+Sierraffinity@users.noreply.github.com> | 2020-05-04 21:14:57 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-04 21:14:57 -0700 |
commit | 4dd3cc7b7691afb8ecd2e8af8b2ebfa717dd2414 (patch) | |
tree | 76cd7fa5a9ed806e19221e8d9a11337355f074f5 | |
parent | b3b99b52ca978104ebed318f1d238fc97892836a (diff) | |
parent | a1244aa5dd4c7519ba6c2dcba5796eec2eba1c90 (diff) |
Merge pull request #1035 from Sierraffinity/master
Document undefined sprite template behavior
-rw-r--r-- | gflib/sprite.c | 2 | ||||
-rw-r--r-- | gflib/sprite.h | 4 | ||||
-rwxr-xr-x | src/mevent2.c | 4 |
3 files changed, 10 insertions, 0 deletions
diff --git a/gflib/sprite.c b/gflib/sprite.c index 2e96acf2c..c7e3d09a3 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -878,12 +878,14 @@ void ResetAllSprites(void) ResetSprite(&gSprites[i]); } +// UB: template pointer may point to freed temporary storage void FreeSpriteTiles(struct Sprite *sprite) { if (sprite->template->tileTag != 0xFFFF) FreeSpriteTilesByTag(sprite->template->tileTag); } +// UB: template pointer may point to freed temporary storage void FreeSpritePalette(struct Sprite *sprite) { FreeSpritePaletteByTag(sprite->template->paletteTag); diff --git a/gflib/sprite.h b/gflib/sprite.h index 9753837fd..c9ba9585d 100644 --- a/gflib/sprite.h +++ b/gflib/sprite.h @@ -182,6 +182,10 @@ struct SpriteTemplate SpriteCallback callback; }; +// UB: template pointer is often used to point to temporary storage, +// then later dereferenced after being freed. Usually this won't +// be visible in-game, but this is (part of) what causes the item +// icon palette to flicker when changing items in the bag. struct Sprite { /*0x00*/ struct OamData oam; diff --git a/src/mevent2.c b/src/mevent2.c index 0bbaf6db8..2991ac27c 100755 --- a/src/mevent2.c +++ b/src/mevent2.c @@ -484,9 +484,13 @@ static void sub_801B7D8(u32 command) } if (dest == NULL) + { AGB_ASSERT(0); + } else if (++(*dest) > 999) + { *dest = 999; + } } } |