out of bounds access in interpreter mode
Currently in progress of porting box86 to android (ndk / bionic) and fixing bunch of compiler warnings in the project, I came upon this which seems quite obvious error, but just confirming that this actually is mistake and me not just understanding something:
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/x86run66.c:586:38: warning: array index 1 is past the end of the array (which contains 1 element) [-Warray-bounds]
tmp32u2= ED->dword[1];
^ ~
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/modrm.h:139:21: note: expanded from macro 'ED'
#define ED oped
^
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/include/regs.h:16:2: note: array 'dword' declared here
uint32_t dword[1];
^
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/x86run66.c:590:33: warning: array index 1 is past the end of the array (which contains 1 element) [-Warray-bounds]
ED->dword[1] = R_ECX;
^ ~
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/modrm.h:139:21: note: expanded from macro 'ED'
#define ED oped
^
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/include/regs.h:16:2: note: array 'dword' declared here
uint32_t dword[1];
^
In file included from /tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/x86run.c:1046:
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/rundc.h:156:24: warning: pragma diagnostic pop could not pop, no matching push [-Wunknown-pragmas]
#pragma GCC diagnostic pop
^
In file included from /tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/x86run.c:273:
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/run0f.h:37:21: warning: array index 2 is past the end of the array (which contains 2 elements) [-Warray-bounds]
ED->word[2] = 0xd000;
^ ~
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/modrm.h:139:21: note: expanded from macro 'ED'
#define ED oped
^
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/include/regs.h:18:2: note: array 'word' declared here
uint16_t word[2];
^
In file included from /tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/x86run.c:273:
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/run0f.h:43:21: warning: array index 2 is past the end of the array (which contains 2 elements) [-Warray-bounds]
ED->word[2] = 0;
^ ~
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/modrm.h:139:21: note: expanded from macro 'ED'
#define ED oped
^
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/include/regs.h:18:2: note: array 'word' declared here
uint16_t word[2];
^
In file included from /tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/x86run.c:273:
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/run0f.h:1116:30: warning: array index 1 is past the end of the array (which contains 1 element) [-Warray-bounds]
tmp32u2= ED->dword[1];
^ ~
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/modrm.h:139:21: note: expanded from macro 'ED'
#define ED oped
^
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/include/regs.h:16:2: note: array 'dword' declared here
uint32_t dword[1];
^
In file included from /tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/x86run.c:273:
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/run0f.h:1120:25: warning: array index 1 is past the end of the array (which contains 1 element) [-Warray-bounds]
ED->dword[1] = R_ECX;
^ ~
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/emu/modrm.h:139:21: note: expanded from macro 'ED'
#define ED oped
^
/tmp/nix-build-box86-android-armv7a-unknown-linux-androideabi.drv-10/box86/src/include/regs.h:16:2: note: array 'dword' declared here
uint32_t dword[1];
^
2 warnings generated.
No it's on purpose. Those opcodes acces 8bytes of memory instead of 4 like most. I'll probably change the way I define the structure later to avoid that warning.
I'll add some CI later for as many platforms as I can, with nix + github actions. Apart from checking builds and warnings would you be interested in static analysis, valgrind, UBSAN, and perhaps code coverage reports?
Why not. But not of this, I guess, will be working to cover the dynarec generated code. But yeah, at least the other code can be checked. The current integrated test are very light, coverage is really low currently.
I already fixed all other warnings, I should have PR in upcoming weeks.