A codebase-wide sweep for json_encode and json_decode without the throw flag, eleven years after the flag arrived.
$ grep -rn 'json_(en|de)code(' src/ | grep -vc JSON_THROW_ON_ERROR
88
# of which, once examined:
# 61 cannot fail in practice — encoding a known array
# 22 could fail and returned false or null silently
# 5 already checked json_last_error() by hand
# all 88 changed anyway. a uniform rule is cheaper to
# review than a judgement per call site.
Twenty-two silent failures is the finding, and one of them had been returning null from an API endpoint for a payload containing invalid UTF-8 from a supplier. The uniform rule is the part worth arguing for: a reviewer checking whether each call can fail is a reviewer who will get one wrong.