【C言語】
printf(書式%s)にNULLが渡る時 “(null)”の表示を期待しないこと


■Windows系で許容されるがLinux系ではNG

#include    <string.h>
#include    <stdio.h>
void    f(char *csv){
    char *cp = strchr(csv,',');
    printf("%s\n",cp);//★NG NULLが渡るかも
}
int main(void){
    printf("%s\n",NULL);//★ 未定義動作
    f("abc,def,ghi");
    f("ghi");
}

Windows系のコンパイラでは書式%sにNULLポインタが渡ると
“(null)”と表示されるそうですが、
Linux系(gcc,clang)では
コンパイラと最適化レベルで結果が異なります。
”(null)”と表示されたり
Segmentation faultと表示して異常終了したりします。


書式%sにNULLポインタを渡すのはC言語規格外の未定義動作なので
職業プログラマはきちんとstrchr()の返却値をチェックして
書式%sにNULLポインタが渡らないようにガードしましょう。

参考:

FIO47-C. 書式指定文字列を正しく使う

https://www.jpcert.or.jp/sc-rules/c-fio47-c.html