[[분류:프로그래밍 언어 문법]] [include(틀:프로그래밍 언어 문법)] [목차] == 개요 == 일부 [[프로그래밍 언어]]들에서 지원하는 [[함수(프로그래밍)|함수]]의 일종. 문자열로 된 표현식을 받아 코드로 해석하여 실행하는 역할을 한다. evaluate의 약자로, 문자열이 코드라고 가정하고 평가해서 실행한다는 의미다. 비슷한 함수로 {{{exec}}} 등이 있다. == 상세 == {{{eval(expression)}}}의 형태로 쓸 수 있다. 일반적으로 코드를 동적으로 실행하기 위해 쓰인다. [[C언어]] 같은 [[컴파일러]] 언어에서는 지원하지 않고 [[Perl]], [[JavaScript]], [[Python]] 같은 스크립트 언어에 존재한다. 사용자가 입력하는 값이나 프로그램이 작동하면서 변하는 값을 문자열의 형태로 반영하여 실행할 수 있기 때문에 간편하다. 실행되는 모습을 보고 싶다면 F12 키를 눌러 자바스크립트 콘솔을 열고, {{{#!syntax javascript e = 1 eval('2 + e')}}} 라고 타이핑해보자. 당신이 두번째 줄의 인자로 입력한 것은 분명히 문자열이지만 정수 2와 변수 e 즉 정수 1을 더하여 3이 출력될 것이다. == eval() is evil == 그러나 {{{eval}}}의 사용은 많은 경우에 금기시된다. '''치명적인 보안 위험'''이 있기 때문이다. [[GOTO]]문의 경우보다도 위험한데, GOTO는 아무리 잘못 써 봤자 그 코드를 다시 편집할 수 없게 만드는 정도에서 그치는 반면 {{{eval}}}문을 잘못 사용하는 경우, 예를 들면 '''네트워크 상에서 가져온 문자열을 실행'''하는 경우 악의적으로 표현식을 작성한 사람에 의해 '''[[All your base are belong to us|모든 너 데이터 다 내거다요]] 등의 사태'''가 일어날 수 있기 때문이다. {{{eval}}}만으로 동적 실행을 하지 않으려고 하면 보안 위험이 적은 대체품은 얼마든지 있다. 일반적인 경우에는 동적으로 변수 등을 정해주는 함수, Python이라면 {{{setattr}}}를 사용하면 될 일이지 {{{eval}}}까지 사용할 이유는 없다. == 여담 == [[나무위키]]는 [[Cloudflare]]를 사용하기 때문에 [[https://namu.wiki/w/eval()]]에 들어가면 코드 인젝션으로 판단되어 차단되었다고 뜬 적이 있다.