181351 posts 1993 follows 1215 followers
Please pay attention to random failures.
https://mstdn.maud.io/@omasanorihttp://blog.llvm.org/2011/05/what-every-c-programmer-should-know_14.html の例はこれですね。
void contains_null_check(int *P) {
int dead = *P;
if (P == 0) return;
*P = 4;
}
このコードに「不要なNULLチェックを削除する」最適化を行うと、int dead = *P;という(PがNULLだとその時点で止まる)文があることから、if (P == 0) return;に到達する場合はチェックせずともNULLでないことは明らかなので if (P == 0) return;が消えます。
その後で「使われていない変数を削除する」最適化を行うとint dead = *P;も消えます。
void contains_null_check(int *P) {
*P = 4;
}
結果、NULLチェックがあったはずのコードからNULLチェックが消えます。何が悪かったかというと最適化の順番……ではなく、int dead = *P;が悪い