Skip to content

Instantly share code, notes, and snippets.

@mzyy94
Last active December 31, 2015 16:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mzyy94/8016375 to your computer and use it in GitHub Desktop.
Save mzyy94/8016375 to your computer and use it in GitHub Desktop.
Bus error: 10 の再現性を確認するためのテスト
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
int mode = 0;
jmp_buf jb;
static const char* label[] = {"auto/set", "auto/read",
"const/read", "static/set", "static/read",
"register/set", "register/read", "volatile/set",
"volatile/read", "normal/set", "normal/read"};
void jump(char t) {
printf("mode: [%s]\n",(label[mode]));
if(t == 10)
puts("Bus error: 10");
else
puts("Segmentation fault: 11");
if(label[++mode] == NULL)
exit(0);
longjmp(jb,2);
}
void sigsegv() {
jump(11);
}
void sigbus() {
jump(10);
}
int main(int argc, char* argv[]) {
int jp; // Jump point
unsigned char t; //temp
auto unsigned char a[1];
static unsigned char s[1];
const unsigned char c[1];
register unsigned char r[1];
volatile unsigned char v[1];
unsigned char n[1];
puts("ARRAY");
signal(SIGSEGV, sigsegv);
signal(SIGBUS, sigbus);
jp = setjmp(jb);
for(int i = 0; ; i++){
switch (mode) {
case 0:
a[i] = '\0';
break;
case 1:
t = a[i];
break;
case 2:
t = c[i];
break;
case 3:
s[i] = '\0';
break;
case 4:
t = s[i];
break;
case 5:
r[i] = '\0';
break;
case 6:
t = r[i];
break;
case 7:
v[i] = '\0';
break;
case 8:
t = v[i];
break;
case 9:
n[i] = '\0';
break;
case 10:
t = n[i];
break;
default:
exit(1);
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment