Code Reading2.1

問題2.1

未初期化変数がどのように扱われるか?

下記のようなソースで試したら、g_a、aともに0だった。

#include <stdio.h>
static int g_a;
int main(int argc, char** argv)
{       
    int a;
    printf("g_a=%d\n", g_a);
    printf("a = %d\n", a);
    return 0;
}       

問題2.2

echoでgetoptが使えないのはなぜ?

いろいろ試したらやっとわかった。-がついた文字が扱えなくなるので、getoptを使っていない。

問題2.3

STREQマクロを使うメリット、デメリットは?
  • メリット ロジックが直感的になる
  • デメリット パラメータチェックができない。

問題2.4

ライブラリコールしていないソースを探せ。直す方法は??

Ruby/dir.cの955行目にあった。まあ普段は、sprintfの戻りとかチェックしないけど。

~省略~
recursive = 1; 
buf = ALLOC_N(char, n+strlen(m)+3);
sprintf(buf, "%s%s", base, *base ? m :m+1);
status = glob_helper(buf, buf+n, flags, func, arg);
free(buf);
if (status) goto finalize;
~省略~

解決方法は、エラーチェックする

if( sprintf(buf, "%s%s", base, *base ? m :m+1) < 0) {
   エラー処理 
} 

問題2.5

標準出力への書き込みエラーについてのプログラムの挙動をチェックするテスト方法を考案せよ。

考え中。。デバッガでエラーを返す。テストスタブとかでエラーを返すってことで答えになっているのかな

問題2.6

sscanf,qsort,strchr, setjmp, open, adjacent_find,FormatMessage,XtOwnSelectionを使用するためのヘッダは?

manで調べた結果です。

関数名 ヘッダ
sscanf stdio.h
qsort stdlib.h
strchr string.h
setjmp setjmp.h
open fcntl.h
adjacent_find ない
FormatMessage ない
XtOwnSelection ない