1. A method of protecting processing elements from buffer overflow attacks, the method comprising the steps of: upon execution of a jump to subroutine, storing a return address in a first location in a stack memory; storing an address of the first location in a second location separate from the stack memory; storing the return address itself in a third location separate from the stack memory; upon completion of the subroutine, comparing the address stored in the second location to the first location in the stack memory; if equal, comparing the return address stored in the third location to the return address stored in the first location in the stack memory; and if equal, returning to the return address.