This kind of thing is called Control Flow Integrity. The 2005 paper below surveys lots of techniques and issues:
I call these things “tactical” rather than “strong” INFOSEC as they target little pieces of the problem in an attempt to (a) avoid solving the whole thing and/or (b) get more performance or legacy compatibility than strong solutions. I’m opposed to tactical solutions in general because they’re usually defeated over time. Many in the above paper were broken or bypassed. Wouldn’t surprise me if those in the OP were as well. The current state of the art in that tactic is probably Code Pointer Integrity with segment-based protection. The CFI model may also be replaced by the Data Flow Integrity model that’s getting more popular. I link to both below.