옛날 보안이 만들고 -> 버그 찾고 (pentest) -> 패치 하고 이 순서대로 진행했다면
만들 때부터 철저하게 설계해서 버그가 없도록 하는게 요새 추세임
이러한 설계를 위해 쓰는 것 중 하나가
프로그램에 여러 제약 조건을 걸어두고 코드가 만족하는지 보는거임
예를 들어서 min(a, b) 함수를 작성한다고 생각하자
그러면 x = min(a, b) 라고 했을 때 ((x == a) or (x == b)) and (x <= a) and (x <= b) 를 만족해야함
주어진 코드를 검사기가 분석해서 저 조건이 빠짐없이 맞는지 확인해줌
문제는 코드를 검사기에 직접적으로 넣을 수가 없고 검사기에 쓸 수 있는 적절한 형태(모델)로 변환시켜야 하는데
이 작업이 그냥 프로그래머가 하기는 힘들어서 전문가가 해야함
그런데 보통 그런분들은 코딩을 못함
결국 할 수 있는게 2가지인데
(1) 코드를 작성해서 툴을 이용해 모델로 변환, 검사기 돌림
이 때 검사기에서 해당 모델을 못 검사하는 경우가 있음. 그러면 모델을 바꿔서 하는 일은 같지만 검사가 가능하게 바꿔야하는데
프로그래머는 어떻게 고쳐야 할지 모르고, 전문가는 어디를 고쳐야 할지 모름;;
(2) 모델을 만들고 툴을 이용해 코드로 변경
이러면 코드가 비효율적이라서 느림
결국 마지막으로 선택한게 하스켈 같은 언어를 이용하는거임
하스켈은 프로그래머가 그나마 배울만하고
전문가도 알아먹을 수 있기 때문에 모델 만들기도 좋음
그래서 많이 이용된다
러스트나 고같은것도 쓰인다지 않았나?
결국 쓰고싶은거 쓰는건데, 함수형 언어 점유율이 다른 분야에 비해서 더 높은 이유라고 할 수 있음
ㅇㄱㄹㅇ 임베디드든 블록체인이든 배포후 수정 전략이 안 통하는 놈들이라 함수형 쓸수밖에 없음. 에이다하고 테조스 ㄹㅇ 안정적인거 보셈 - dc App
얘는 [...] 를 모르나?
글쓴이는 assert 를 모르는 게 아니라 코드상에 존재하는 attack vector 를 줄이는 방향으로 설계하는 걸 이야기 하는거임
[...]가 그 역할을 할수있는데
이건 어그로가 아니라 ㄹㅇ 함수형에 대해 몰라서 그러는듯 - dc App
그 역할 할 수 있는 건 다들 알고 있지, 근데 취약점은 개발자의 잘못된 추정으로 발생해서 협업 단계에서는 전부 잡아내지 못함 코드의 복잡도가 증가하면 누가 일일이 눈으로 보면서 정적 테스트 하고 있겠음? 검증 / 리뷰는 이미 다 되어 있어서 굳이 그걸 해야 할 필요성도 못 느낄걸?
assert는 그냥 케이스 대입하는거고 글에서 말하는건 정적분석 같은데
복잡도가 기하급수하적으로 증가 된 코드에서 최소한의 부분만을 탐색하고 싶다는거지, 잠수함 찾을 때 대잠초계기로 전 세계 바다를 다 돌아다니는 것 보다는 위성으로 잠수함의 잠항 시간과 위치를 찾은 다음에 잠수함이 존재할 수 있는 곳을 추정해서 탐색 범위를 줄이는 게 더 효율적이잖아
https://news.ycombinator.com/item?id=21425804
최근 발견 된 크롬 제로데이 취약점에 관한 토픽임, 읽어보면 아래에 커밋 기록들 있는데 그거 한번 봐보셈 코드의 복잡도가 기하급수적으로 증가하면 정적분석 툴이 아무리 발전해도 halting problem 한테 박히면 꼼작도 못한다는 것을 알 수 있을거임
어쨋든, 이미 협업으로 작성 된 코드를 사람이 assert 박아가며 모듈단위로 테스트 하거나 눈으로 전부 훑어 볼 수 없으니까 설계 자체를 정적분석에 용이하게 하자는거임
수정하다 오타남 기하급수하적 → 기하급수적
ㄹㅇ 불완전성 정리니 정지문제니 처음 들었을 때는 수학자들은 이상적인 이야기 정말 좋아하구나 라고 생각했었는데, 생각보다 훨씬 현실적인 문제였음 ㅋㅋ
ㅇㅇ 함수형 좋음 - dc App
객체지향과 반대고 써먹기 힘들다는 사람도 있는데 기존 시스템과도 융합 잘되쥬. - dc App