幽霊の正体見たり枯れ尾花

セキュリティ関連や自分の趣味などを発信してます

セキュリティキャンプ 応募課題晒し 2019


フィジカルトラック応募課題

2019 Dトラック

 下記の設問A,Bにそれぞれ回答してください。設問Bは1問のみ選択して回答してください。入力欄で表現できないもの(ソースファイル、図表、動画など)はURLを示してください。但しURLが示すコンテンツは募集締め切り以前のものに限ります。

A.下記はフィジカルトラックが求めるキャンパー像ですが、これに対し自身の経験やSC(※)に対する思いを述べてください。
・現時点での到達ではなくSC参加(我々が提供するコンテンツ)により伸びるであろう人材。
・活字等で得た知識に満足せず実際に自分の手を動かして物事の本質に迫ろうとする人。(物事の本質を見極めるまで途中で納得せず自分の手を止めない人。)
・SCで発掘あるいは評価しないと埋もれてしまいがちな特技の持ち主。
・SC修了後も自分の意志で継続的に課題に取り組む人。
・自分の得た知見を他の人と共有するための行動を起こす人。
※SCは2019年度セキュリティ・キャンプ全国大会の略

B.以下の課題のうちひとつを選らび回答してください。総合的な回答ではなく、どの部分にフォーカスしたかを述べ, なるべくディープ回答を求めます。

B.1 作ってみたいCPUの仕様書を作成してください。特徴・用途、命令セットとそれに対応するビット列は必須とします。必ずしも現存する商用化されている汎用CPUにとらわる必要はありません。

B.2 LEDを点滅させるプログラムを示し、LEDが実際に点滅するまでの過程を解説してください。

B.3 高級言語ではできないことについて解説してください。

B.4 C言語の関数longjmp setjmpを用いたプログラムを示し.それらを解説してください。

B.5 群論コンピュータサイエンスのかかわりについて思うところを述べて下さい。

B.6 LSIを製造できる装置が使えるとしらどのようなものを作りたいですか。装置の所有者を納得する提案書を作成してください。

B.7 サイバーセキュリティの分野で半導体機械語の知識が必要な理由を自分なりの言葉で述べて下さい。

回答

 私はA(必須)とB.4(選択)に答えました.

A.下記はフィジカルトラックが求めるキャンパー像ですが、これに対し自身の経験やSC(※)に対する思いを述べてください。

 原文を載せたいところですが,恥ずかしいので概要で許してくれ~

気をつけたこと

  • 最初はキャンパー像の中から3つくらいピックアップして,答えていきました.例えば「自分の得た知見を他の人と共有するための行動を起こす人。」に対してツイッターやブログで情報発信していくなど.そしてその後に,なぜフィジカルトラックにしたかを(興味があったからだけではなく,なぜ興味を持ったのか自分の経験や考えをいれながら)書きました.
  • だらだら長く書いてもしょうがないのでコンパクトに.最初は2000文字くらいだったが,削っていき1700文字くらいにして内容を濃くしました.(講師の方はいくつもの課題に目を通すので,できるだけ見やすくなるように書くといいかも)

文字数

f:id:houtarou_dism:20190614130134p:plain
Word文字カウント

 文章を書く問題なので知識はいりません.熱い思いを文章に書いて,講師にぶつけましょう!!!(問に対して的外れな回答はしないように気を付けて)

B.4 C言語の関数longjmp setjmpを用いたプログラムを示し.それらを解説してください。

ソースコード

#include <cstdlib>
#include <setjmp.h>
#include <iostream>
#include <iomanip>
 
using namespace std;
jmp_buf jmp;
   
double Division_cal(double x, double y) {
 
	double resu = 0;
	
	if (x == 0) {
		longjmp(jmp, 1);
	}
	else {
		resu = y / x;
		return resu;
	}

}
  
void Exception_handling(void) {
	cout << "0 is included in a denominator" << endl;
}
  
int main(void) {
  
	double deno = 0;  //分母
	double nume = 0;  //分子
	double res = 0;   //結果
  
	cout << "   ★Division program★ " << endl;
	cout << " - Please enter a number - " << endl;
	
	while (1) {

		cout << "denominator:" << flush;
	
		if (!(cin >> deno)) {
			cout << "Input more than significant digits or non-numeric input" << endl;
			cin.clear();   //エラー状態をクリア
			cin.ignore(1024, '\n');   //内部バッファのデータを破棄
			continue;   //繰り返し
		}
		cin.ignore(1024, '\n');
		break;
	}

	while (1) {

		cout << "molecule   :" << flush;

		if (!(cin >> nume)) {
			cout << "Input more than significant digits or non-numeric input" << endl;
			cin.clear();
			cin.ignore(1024, '\n');
			continue;
		}
		cin.ignore(1024, '\n');
		break;
	}
	if (setjmp(jmp) == 0) {
		res = Division_cal(deno, nume);
		cout << "Division result:" << setprecision(4) << res << endl;   //整数部・小数部含めて5桁表示
	}
	else {
		Exception_handling();
	}
	system("PAUSE");   //プログラムの一時停止
	
	return 0;
}


除算プログラム.setjmp,longjmpは分母に0が入力された時の例外処理に使用している.
!(cin >> deno)で入力された数値が正しいか判定する.
double型を超える数値の入力または数値以外が入力された場合,"Input more than significant digits or non-numeric input"と出力され再度数値の入力を求める.
setjmpマクロを実行すると,現在の情報をjmp_buf型の引数jmpに保存し,ゼロが返る.
そして,Division_cal()関数が呼び出され分母(deno)に0が入っているとlongjmp()関数が呼び出される.longjmp()関数がjmp_buf型の引数jmpを伴って呼び出されると,longjmp()関数の第二引数を返り値として,setjmpに処理が移る.第二引数の値は1なのでif else文の判定は偽となり,Exception_handling()関数が呼び出され,"0 is included in a denominator"と出力される.
正しい数値が入力されている場合は,Division_cal()関数により除算が行われその返り値を変数resに代入する.そしてresの値を整数部・小数部含めて5桁表示で出力する.

このプログラムは小規模で名前衝突の可能性がないため,using namespace stdを使用している.
scanfはバッファオーバーランなど様々な危険性があるため,cinを用いた.
プログラムを書き終えた後,visual studio2019デバッグなしでは想定の動作をしていたが,visual studio2017デバッグなしではプログラムの実行が終わるとコマンドプロンプトが終了するようになっていた.またvisual studio2019のデバッグありでも同様の動作をした.調べてみると「VS2010からどうも「空のプロジェクト」を作るとデフォの状態だとプログラムの実行が終わると自動でウィンドウが消えてしまう様になっているらしい」とブログで書いている方がいた.設定から変えられるみたいだが,プログラムのほうで一時停止をいれることにしたためsystem("PAUSE")をいれた.それによってvisual studio2019デバッグありでは計算結果が出力されたが,デバッグなしではキー入力待ちが2回になってしまった.それでも計算結果が出力されなければ話にならないのでこのプログラムにした.
setjmp(),longjmp()を使用したプログラムを書いたことをなかったため,動きを調べることから始まった.
下記のサイトを参考にした.
https://qiita.com/jj1bdx/items/ba1b71641cd51a5ac186

以上で課題晒しは終わりです.

上のソースコードはダブルクリックで全体を選択できます.

↓ ↓ ↓ githubはこちら ↓ ↓ ↓
github.com