반환 지향형 프로그래밍
반환 지향 프로그래밍은 스택 스매싱의 진화된 버전이다. 일반적으로 공격들의 이러한 종류들은 상대방이 프로그램의 버그(주로 버퍼 오버런)를 이용함으로써 콜 스택을 조작할 때 발생한다. 버퍼 오버런 시에 사용자가 제공하는 데이터를 적절한 경계 검사 없이 메모리에 저장하는 함수는 적정한 양보다 더 많은 데이터를 받아들일 수 있다. 데이터가 스택에 겹쳐써지면 초과된 데이터는 함수의 변수에 할당된 공간을 넘치게 되고 반환 주소도 겹쳐쓰게 된다. 이 주소는 이후에 함수에 의해서 제어 흐름을 다시 호출자로 넘겨줄 때 사용된다. 만약 겹쳐써졌다면 제어 흐름은 새로운 반환 주소로 넘겨지게 된다.
프로그래밍 패러다임
소프트웨어 공학의 서로 다른 무리가 서로 다른 "방법론"을 지원하듯이, 서로 다른 프로그래밍 언어는 서로 다른 "프로그래밍 패러다임"을 지원한다. 어떤 언어들은 하나의 특정한 패러다임을 지원하기도 하는데, 스몰토크와 jdk 1.8 이전의 자바가 객체지향 프로그래밍을 지원하는 반면에, 하스켈과 스킴은 함수형 프로그래밍을 지원한다. 여러 가지 패러다임을 지원하는 언어들도 있는데, 커먼 리스프, 파이썬, 오즈, jdk 1.8 이상의 자바 등이 이런 언어들이다. ("몇년 전까지 자바는 명령형 프로그래밍, 객체지향 프로그래밍 패러다임을 따르기로 유명했다. 하지만 jdk 1.8 부터 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입했고 선언형 프로그래밍의 장려를 위해 Stream과 같은 표준 API 등도 추가했다. 그러나 태생부터 함수형 패러다임을 지원하는 여타 언어들과는 달리 여전히 함수를 일급객체로 취급하지는 않는다. 자바에서 람다식은 함수형 인터페이스를 구현하는 익명클래스의 인스턴스를 생성하며, 좀 더 간단한 표현을 위해 컴파일러의 타입 추론이 동원된다." )