fmtcheck
(https://linux.die.net/man/3/fmtcheck , part of libbsd on Linux, or available on BSDs) does this, though the man page mentions that it does not support all extensions that printf
does.
According to https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=224143 , fmtcheck
ignores unused arguments, which may or may not be what you want.