If you use printf-like function without precise understanding semantics, you're asking for trouble. No amount of careful design is going to change that.
Not necessarily, because a robust DSL can enforce its semantics. When your "DSL" is just a string to the parent language, not so much. (Though modern compilers can emit warnings about obvious printf issues like incorrect types.)