fcloseにNULLを渡せるか?

調べてみると少なくとも標準Cでは規定されていないみたい。fcloseにNULLを渡したときの動作についてはふれていないようだ。fopenに失敗するとNULLが返るので後始末は何でもfcloseと思っていたのだけどだめなのだな。freeに対してはNULL渡してOKなのに、、。

void func(void)
{
    char *p = NULL;

    p = malloc(1024);
    if (p == NULL) {
        goto FINALLY;
    }
    /* 様々な処理 */

    if (accident) {
        /* accident発生の時はとにかくFINALLY */
        goto FINALLY;
    }

FINALLY:
    free(p);
}

というようなことをFILEポインタでもやりたかったのだがfopenに失敗したときだけreturnしなければならない。美しくなくていやだな。

void func(void)
{
    FILE*fp = NULL;

    fp = fopen("hoge.txt", "r");
    if (fp == NULL) {
        /*goto FINALLY;*/
        return;
    }
    /* 様々な処理 */

    if (accident) {
        /* accident発生の時はとにかくFINALLY */
        goto FINALLY;
    }

FINALLY:
    fclose(fp);
}