ホーム » スタッフ (ページ 170)

スタッフ」カテゴリーアーカイブ

2025年7月
 12345
6789101112
13141516171819
20212223242526
2728293031  

検索・リンク

ファイル処理演習と安全な入力

ファイル処理に関する説明が終わったので、 ファイル処理の演習を行う。 演習にあたって、バッファオーバフローの危険性やその対応方法などの説明も行う。

演習とファイル入出力

演習は、ファイルの入出力であることから、あらかじめ作っておいたデータファイルを 読み込み、何らかの加工を加えてファイルに出力とする。 データは、名前+点数5科目、名前+身長体重、名前+生年月日より、 出席番号に応じて課題に取り組む。

ファイル入力+出力の処理の大まかは、以下のとおりになるだろう。

FILE* fp_in ;
FILE* fp_out ;
if ( (fp_in = fopen( "..." , "rt" )) != NULL ) {
if ( (fp_out = fopen( "..." , "wt" )) != NULL ) {
while( fscanf( fp_in , .... ) != ... ) {
fprintf( fp_out , .... ) ;
}
fclose( fp_out ) ;
}
fclose( fp_in ) ;
}

安全な入力

ファイルの説明にあたり、scanf() の %s , %d の入力の仕組みとして、 「基本は空白があれば読み飛ばし、空白を見つけるまでをデータとして格納」 といった説明を、ファイルポインタ(FILE*という意味でなく、ファイル上の読み書き位置の意味)を交えながら解説する。

char  str[ 10 ] ;
scanf( "%s" , str ) ;

安全な入力対策として、上記のような入力は、10文字以上のデータを与えた場合、 危険であることを説明する。 特に、文字配列が局所変数であれば、近辺にある"関数からの戻り番地"も破壊される 可能性がある。さらに配列をはみ出す領域に、悪意のあるプログラム(機械語)を配置し、 関数戻り番地をそのプログラムに合わせることができれば、悪意のあるプログラムを 起動できることを説明する。(一般的にバッファオーバフローと呼ばれる)

このため、バッファオーバフローを起こさないためにも、入力文字制限の 可能な fgets() を使用するなどのテクニックも紹介する。

FILE* fp ; // 何らかのファイル
char buff[ 100 ] ;
while( fgets( buff , sizeof( buff ) , fp ) != NULL ) {
char name[ 100 ] ;
int  data ;
if ( sscanf( buff , "%s%d" , name , &data ) == 2 ) {
// name,dataを使った処理
}
}

2012年7月1日(第275回)

ゲスト:福井高専43期生 五十嵐様

  • 部活動特集!
    高専地区大会に向けて

担当:前田勝(3EI)、松島(1C)

7/1は、うるう秒の日

C言語の標準関数のlocaltimeでも、想定はしている。 実装は…NTPの上位サーバでもなけりゃ、いい加減だろうけど…

1206301049_694x521.jpg

創造工学演習の熱気のある風景

1206291222_960x640.JPG

リスト処理を用いたスタック

前回の課題の演習が終わっていない人も多いので、 前半を講義で、後半は演習課題の続きとした。

配列のスタック

int stack[ 100 ] ;
int *sp = stack ;
void push( int x ) {
*sp = x ;
sp++ ;
}
int pop() {
sp-- ;
return *sp ;
}
void main() {
push( 1 ) ;
push( 2 ) ;
push( 3 ) ;
printf( "%d" , pop() ) ; // 3
printf( "%d" , pop() ) ; // 2
printf( "%d" , pop() ) ; // 1
}

この様なプログラムでは、最後に入れたデータを最初に取り出せるということで、 "Last In First Out(LIFO)"と呼ぶ。一般的にはスタック。

このようなスタックは、関数の戻り番地や局所変数管理に使われる。 また、上記のプログラムでは、stackの配列が100件分しかないので、 push()が連続100回呼び出されれば、配列をはみ出してしまう。

リストのスタック

前述のとおり、配列の大きさ以上のpush()できないので、 必要に応じてメモリを確保するリスト構造を使ってpush() , pop()を書いてみる。

struct List* sp = NULL ;
void push( int x ) {
// mallocに慣れてほしいので、わざと補助関数consを使わずに
struct List* n ;
n = (struct List*)malloc( sizeof( struct List ) ) ;
if ( n != NULL ) {
n->data = x ;
n->next = sp ;
sp = n ;
}
}
int pop() {
struct List* d = sp ;
int ans = sp->data ;
sp = sp->next ;
free( d ) ;
return ans ;
}

認証評価自己点検書完成

今年は福井高専は認証評価とJABEEの審査の重なる年。ひとまず、認証評価自己点検書が完成、印刷して送付するんだけど、ただいま印刷の落丁の確認と印刷の変なところの差し替えで、疲れた…^_^;

1206272037_640x618.jpg

絶対PATH/相対PATH演習+C言語のファイル

今週は公開授業週間ということで、私のプログラミング応用も見学を受けた。 同じ学科の先生だし妙な緊張もなく、いつもどおり。
# 気合が少し入ったのか声の大きさは20%増しだったかも。

先週の絶対/相対PATHの演習ということで、 最初にコマンドラインでのファイル・ディレクトリ生成・削除を説明し、 配布資料に説明した、ディレクトリ構造をコマンドラインで生成する演習。

cd PATH
dir PATH
type PATH
mkdir PATH
rmdir PATH
echo DATA > PATH
del PATH

C言語のファイル

ファイルに関連する話ということで、 最初にFILE型を説明し、fopen,fclose,fscanf,fprint などを解説。

fopenの説明では、テキストモード・バイナリモードなども交えて解説する。 第一引数のファイル指定では、Windowsのディレクトリ区切り文字に 対する注意点なども交えて解説を行う。

FILE* fp ;
if( (fp = fopen( "¥¥Windows¥¥PATH¥¥abc.txt" "rt" )) != NULL ) {
int x ;
while( fscanf( fp , "%d" , &x ) == 1 ) {
printf( "%d" , x ) ;
}
fclose( fp ) ;
}

公開授業週間

今週は公開授業週間という、他の先生の授業を見学することで 自分の授業方法の改善につなげよう….という授業見学を行う週。 私自身も、ベテランの先生と若手の先生の授業を見学させてもらった。 他の方の見学があると、なかなか緊張し、 私自身が教員としての最初の授業で、 手が微妙に震えていたことを思い出す。

監視サーバを増やしてみた

UPS設置の単純ミスで、サーバが動かなくなったり していたため、改めてサーバ監視 nagios3 の設定を 確認し、自分の管理している他のサーバの監視設定などを増やしてみた。

ちょいと、表示アイコンなども見直して、 解かりやすくしてみた。 Debian アイコンと Tux君が自分の管理しているサーバ。

1206262106_624x467.png

UPSがおかしいと思ってたらバッテリ配線が…

昨日、サーバ監視ソフトが異常を知らせてくるので、確認したら UPSがフリーズしてる。給電されていないし、パネルのボタンを押しても無反応。 しかたがないので、落ちたサーバなどを一時的に別コンセントにつないで 起動させ、一度完全放電させて壊れていないか確認してみた。

完全放電させたら、復活してくれて万々歳なんだが、 先月にも同じように給電が止まってサーバが落ちたし、 改めてUPSの機能を確認。 すると、UPSの横に貼られた黄色い目立つシールに、 "STOP/HALT Connect Battery"と書いてあるじゃん。 UPSを買った時には、STOP/HALTの文字だけみて給電を止める時の注意書きと 勝手に誤解していたけど"Connect Battery"とな。 しっかりシールを剥がして確認すると、UPS内部のバッテリーの配線が "安全のために"抜いてある….(x_x; ということは、今まではUPSといっておきながら、単なる大きなコンセント状態。 停電・瞬停であれば、そのまま落ちてあたりまえ。

あまりにも恥ずかしいミス….

システム

最新の投稿(電子情報)

アーカイブ

カテゴリー