c_cpp 总线错误:10の再现性を确认するためのテスト

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 总线错误: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;
}

以上是关于c_cpp 总线错误:10の再现性を确认するためのテスト的主要内容,如果未能解决你的问题,请参考以下文章

markdown GitPitchでコミットログをキレイにするための提示

ruby CFBundleVersionを更新するためのFastlane行动

sh HomebrewでMacのセットアップをするためのスクリプト

sh シェルスクリプトで店员さんについて说明するためのスクリプト

python 蟒蛇の瓶子で书いているAPIをテストするために,WebTest的を使ったテストツールを试してみました.unittestの基本的な构成のみですが,自分用メモ及公开しておきます。

markdown やる気を出すための10の方法