
■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