それと(なぜか)上で一切触れられてない観点だが
実行時に起こり得るエラーとバグによるプログラムエラーでは
まるで違う話だ
後者があるものは本来納めちゃいかんだろ
それをなるべく早期に(テスト中に)検出するのがassert()やabort()
の目的なんだから
バグがあっても何となく動くように作りそのようなゴマカシを
残したまま納めるのは正しい姿勢か?
確かにassert()はDEBUG版コンパイルでは機能しない
ならば潔くabort()をつかえ
"バグです"
と言ってしぬのだ