SlideShare a Scribd company logo
1 of 25
C++ 미정의 행동(Undefined Behavior)
저게 뭔데, 왜 신경 써야 하는데?
쪼꼬두유
시작하기 전에
이 PT는 C++ Now 2014의 발표를
번역했습니다.
https://www.youtube.com/w
atch?v=uHCLkb1vKaY
https://github.com/boostcon
/cppnow_presentations_2014
/blob/master/files/Undefined
-Behavior.pdf
오역 의역 넘쳐남…
영어를 발로 배웠어요…
미정의 행동(Undefined Behavior)
C++ - N3691(C++ 14)에 보면
1.3.24 Undefined Behavior
behavior for which this International
Standard imposes no requirements
해석하자면
국제 표준에서 문제가 되는 요구사항을 강요하는 행동
-> 하지 말라는 행동
http://www.open-
미정의 행동(UB) 의 예
• Program crashes
• Program이 기대하지 않은 결과를 냈다.
• 컴퓨터가 불이 났다.
• 고양이가 임신했다.
• 프로그램이 잘 동작한다.
• 답이 잘못된 것이 없다.
Example 1. 답이 잘못된게 없음
1
2
3
4
5
6
int main ()
{
int arr [] = { 0, 2, 4, 6, 8 };
int i = 1;
cout << i + arr[++i] + arr[i++] << endl;
}
컴파일 잘 됨 에러 안남 문법적인 에러는 없음
근데 컴파일러마다 값이 다름
같은 코드인데 값이 다름
고객에게 들고갔을때 값이 다를 수도 있다는 얘기
gcc ++ 10
clang c++ 10
미정의 행동을 만드는 법
• 부호 있는 integer의
overflow(unsigned int 아님)
• Malloc 값이 0인 포인터나 NULL인 포
인터를 가리킴
• 피연산자의 값의 범위보다 같거나 더 큰
shift 연산
• 초기화 되지 않은 값 읽기
• 표현식을 한번 이상 수정하기
미정의 행동을 만드는 법
• 버퍼 overflow
• 두개의 다른 데이터 구조체 포인터 비
교하기(ex. Array 랑 list랑 비교)
• 포인터 overflow
• Const 로 선언된 객체 수정하거나
string 문자열 수정하기
미정의 행동을 만드는 법
• -INT_MIN(#define INT_MIN (-2147483647 - 1), bit연산시 –연산하면 값이 정
확하지 않을수 있음 참고 : http://stackoverflow.com/questions/8511598/large-negative-integer-
literals)
• Data race(멀티스레드가 같은 데이터를 이용하고 다른스레드에서 업데이트 할때 발생,
서로 다른 스레드에서 데이터 동기화에 실패함 그래서 락 걸고 접근해서 데이터 수정해야함)
• New랑 delete랑 쌍이 맞지 않음
• 파일을 읽기도 전에 씀
– 버퍼에 쓰기도 전에 값을 복사함
대부분은 컴파일 타임에 에러 발생, Data race 빼고
야호!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <new>
class Foo {}; // complicated class
int main()
{
Foo* p[4];
for (int i = 0; i < 4; ++i)
{
p[i] = new Foo();
}
// ..much later..
delete p; //포인터 배열 어디감…
return 0;
}
atomic is lock free
C++ - N3691(C++ 14)
20.9.2.5 shared_ptr atomic access
Concurrent access to a shared_ptr object from multiple
threads does not introduce a data race if the access is
done exclusively via the functions in this section and
the instance is passed as their first argument.
Atomic을 사용하면 Data Race를 방지할 수 있음
산술연산
5 - 4 If during the evaluation of an expression, the result is not
mathematically defined or not in the range of representable
values for its type, the behavior is undefined
-> 컴파일 하는 동안 결과가 type의 범위를 넘어가는 경우는 미정의 행동이
다.
[ Note: most existing implementations of C++ ignore integer
overflows. Treatment of division by zero, forming a remainder
using a zero divisor, and all floating point exceptions vary among
machines, and is usually adjustable by a library function. — end
note ]
->C++에서는 int의 overflow를 무시하기 때문에 0으로 나눈다던지 제수가
0이라던지 부동 소수점의 예외처리는 시스템마다 다르기 때문에 사용하면
안된다.
Example 2. 답이 잘못된게 없음
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdbool.h>
int _tmain(int argc, _TCHAR* argv[])
{
bool b;
if (b)
printf("truen");
if (!b)
printf("falsen");
return 0;
}
컴파일 잘 됨 에러 안남 (vs 는 남(똑똑))
근데 컴파일러마다 값이 다름
B가 뭐로 초기화 될지 모르기 때문
왜 C++, C는 이모양이죠?
• 미 정의 행동을 하게 되면 컴파일러가
체크를 할 때 작은 코드를 생성할 여지
를 주게 된다.
• 미정의 행동을 하지 않으면 컴파일러
는 더 빠르고 간단하게 코드를 컴파일
할 수 있게 된다.
미 정의 행동을 안 하는것이 왜 중요한데?
• 컴파일러가 미정의 행동이라는 사실을 알기
때문에, 그래서 최적화에 도움이 된다.
• 다른 컴퓨터에서 실행할 때 같은 결과를 낼
수 있다.
• 미정의 행동은 잘못된 답이다!!!
다른 관점으로 생각하면
• 미정의 행동이 없으면 input이 뭐든
상관 없다.
• 어떤 미정의 행동은 모든 input을 처
리 할 수 있다.
• 미정의 행동은 input에 상관없이 항상
일어난다.
Example 3.
컴파일 잘 됨 에러 안남
Malloc 실패하면 어쩔껀데...??
1
2
3
4
5
6
7
8
9
10
11
12
int* do_someting(int *p)
{
printf("do_something %d n", *p);
if (!p)
{
// code here
p = (int *)malloc(...);
// more code here
}
return p;
}
Example 4.
컴파일 잘 됨 에러 안남
부호 있는 integer의 overflow는??
1
2
3
4
5
6
7
8
9
10
11
12
13
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0x10000000;
int c = 0;
do
{
c++;
i += i;
printf("%dn", i);
} while (i > 0);
printf("%d iterationsn", c);
}
왜 신경써야 하나?
• 미 정의 행동 코드를 짜기 엄청 쉽다.
• 컴파일러가 업그레이드 되거나 최적화
가 잘 되어 있으면 미정의 행동 코드는
잠깐은 잘 될 수도 있다.
• 미 정의 행동은 교묘한 코드에 나타나
니 자주 코드 보안을 체크할것
Don’t be this guy
난 그러면 어떻게 해야 하나
• 미정의 행동을 항상 인식해라
• 컴파일러를 비난하지 마라
• 결과가 뭐가 좀 이상하면 미정의행동
에 대해 생각해 볼것
• 여러 컴파일러를 통해서 컴파일 해 비
교해볼것
빌드한 후에 미정의 동작을 만나면
• 이미 늦음
• 이미 프로그램 죽었을껄...
만약에 이런 코드를 작성했다면
Bool WillThisOverflow(int a)
{ return a + 100 < a; }
컴파일러는 최적화를 이렇게 할것이다
Bool WillThisOverflow(int a)
{ return false; }
따라서 이렇게 작성하라
Bool WillThisOverflow(int a)
{ return a < (INT_MAX – 100); }
미정의 행동을 찾아주는 tool
• 은 나타나기 시작했다.
• Clang은 –fsanitize = undefine를 사
용하면 된다.
– http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
• John Regehr's Integer Overflow
Checker
• STACK (this past summer from
MIT)
C++ 미정의 행동(undefined behavior)
C++ 미정의 행동(undefined behavior)

More Related Content

What's hot

프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법YEONG-CHEON YOU
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
[C++ Korea] Effective Modern C++ Study, Item 11 - 13
[C++ Korea] Effective Modern C++ Study, Item 11 - 13[C++ Korea] Effective Modern C++ Study, Item 11 - 13
[C++ Korea] Effective Modern C++ Study, Item 11 - 13Chris Ohk
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들DongMin Choi
 
190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁KWANGIL KIM
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들Chris Ohk
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Resultsmametter
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화Seungmo Koo
 

What's hot (20)

프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
[C++ Korea] Effective Modern C++ Study, Item 11 - 13
[C++ Korea] Effective Modern C++ Study, Item 11 - 13[C++ Korea] Effective Modern C++ Study, Item 11 - 13
[C++ Korea] Effective Modern C++ Study, Item 11 - 13
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
 
190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
 
행동 트리
행동 트리행동 트리
행동 트리
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
Boost Fusion Library
Boost Fusion LibraryBoost Fusion Library
Boost Fusion Library
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
 

Viewers also liked

2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용
2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용
2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용은아 정
 
2015.12.05 쪼꼬두유 방황기
2015.12.05 쪼꼬두유 방황기2015.12.05 쪼꼬두유 방황기
2015.12.05 쪼꼬두유 방황기은아 정
 
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"은아 정
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현MinGeun Park
 
2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유은아 정
 
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"은아 정
 
페차쿠차2014 1
페차쿠차2014 1페차쿠차2014 1
페차쿠차2014 1은아 정
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D흥배 최
 
좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰Leonardo YongUk Kim
 

Viewers also liked (20)

2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용
2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용
2016.02.20 어쩌다보니 cocos2d x 사용하게 된 이야기 업로드용
 
2015.12.05 쪼꼬두유 방황기
2015.12.05 쪼꼬두유 방황기2015.12.05 쪼꼬두유 방황기
2015.12.05 쪼꼬두유 방황기
 
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
2015 데브루키 페차쿠차 "Rim Light(림라이트) 만들기"
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
 
2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유2015.08.01 회사원쪼꼬두유
2015.08.01 회사원쪼꼬두유
 
C++ stl
C++ stlC++ stl
C++ stl
 
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"
2016 페차쿠차 "cppcheck, effective c++과 함께하는 bts"
 
Composer
ComposerComposer
Composer
 
The Git - (#1/2)
The Git - (#1/2)The Git - (#1/2)
The Git - (#1/2)
 
A brief guide to android gradle
A brief guide to android gradleA brief guide to android gradle
A brief guide to android gradle
 
Anatomy of an android
Anatomy of an androidAnatomy of an android
Anatomy of an android
 
Butter android views
Butter android viewsButter android views
Butter android views
 
Realm Java
Realm JavaRealm Java
Realm Java
 
Tensorflow 101
Tensorflow 101Tensorflow 101
Tensorflow 101
 
페차쿠차2014 1
페차쿠차2014 1페차쿠차2014 1
페차쿠차2014 1
 
Actionbar and fragment
Actionbar and fragmentActionbar and fragment
Actionbar and fragment
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
3D Graphics 101
3D Graphics 1013D Graphics 101
3D Graphics 101
 
좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰
 
Modern android
Modern androidModern android
Modern android
 

Similar to C++ 미정의 행동(undefined behavior)

문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의Kwangyoun Jung
 
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준Seok-joon Yun
 
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...Seok-joon Yun
 
객체지향 정리. Part1
객체지향 정리. Part1객체지향 정리. Part1
객체지향 정리. Part1kim HYUNG JIN
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기Ryan Park
 
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅Youngmin Koo
 
클린코드 17장
클린코드 17장클린코드 17장
클린코드 17장진화 손
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10Ryan Park
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들영욱 오
 
랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorialLee Seungeun
 
7급 공무원도 쉽게 따라하는 프로파일링 도구 만들기
7급 공무원도 쉽게 따라하는 프로파일링 도구 만들기7급 공무원도 쉽게 따라하는 프로파일링 도구 만들기
7급 공무원도 쉽게 따라하는 프로파일링 도구 만들기Young-Ho Cha
 
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발동현 김
 
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)NAVER D2
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍QooJuice
 
TML studio & Beep 알고리즘 스터디, 오리엔테이션
TML studio & Beep 알고리즘 스터디, 오리엔테이션TML studio & Beep 알고리즘 스터디, 오리엔테이션
TML studio & Beep 알고리즘 스터디, 오리엔테이션재원 최
 
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018Kenneth Ceyer
 
스타트업 인턴 개발자 3달간의 고군분투기 김은향
스타트업 인턴 개발자 3달간의 고군분투기 김은향스타트업 인턴 개발자 3달간의 고군분투기 김은향
스타트업 인턴 개발자 3달간의 고군분투기 김은향Eunhyang Kim
 

Similar to C++ 미정의 행동(undefined behavior) (20)

문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의
 
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준
 
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
 
객체지향 정리. Part1
객체지향 정리. Part1객체지향 정리. Part1
객체지향 정리. Part1
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기
 
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
 
클린코드 17장
클린코드 17장클린코드 17장
클린코드 17장
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial랩탑으로 tensorflow 도전하기 - tutorial
랩탑으로 tensorflow 도전하기 - tutorial
 
7급 공무원도 쉽게 따라하는 프로파일링 도구 만들기
7급 공무원도 쉽게 따라하는 프로파일링 도구 만들기7급 공무원도 쉽게 따라하는 프로파일링 도구 만들기
7급 공무원도 쉽게 따라하는 프로파일링 도구 만들기
 
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
 
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
TML studio & Beep 알고리즘 스터디, 오리엔테이션
TML studio & Beep 알고리즘 스터디, 오리엔테이션TML studio & Beep 알고리즘 스터디, 오리엔테이션
TML studio & Beep 알고리즘 스터디, 오리엔테이션
 
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
 
스타트업 인턴 개발자 3달간의 고군분투기 김은향
스타트업 인턴 개발자 3달간의 고군분투기 김은향스타트업 인턴 개발자 3달간의 고군분투기 김은향
스타트업 인턴 개발자 3달간의 고군분투기 김은향
 

C++ 미정의 행동(undefined behavior)

  • 1. C++ 미정의 행동(Undefined Behavior) 저게 뭔데, 왜 신경 써야 하는데? 쪼꼬두유
  • 2. 시작하기 전에 이 PT는 C++ Now 2014의 발표를 번역했습니다. https://www.youtube.com/w atch?v=uHCLkb1vKaY https://github.com/boostcon /cppnow_presentations_2014 /blob/master/files/Undefined -Behavior.pdf 오역 의역 넘쳐남… 영어를 발로 배웠어요…
  • 3. 미정의 행동(Undefined Behavior) C++ - N3691(C++ 14)에 보면 1.3.24 Undefined Behavior behavior for which this International Standard imposes no requirements 해석하자면 국제 표준에서 문제가 되는 요구사항을 강요하는 행동 -> 하지 말라는 행동 http://www.open-
  • 4. 미정의 행동(UB) 의 예 • Program crashes • Program이 기대하지 않은 결과를 냈다. • 컴퓨터가 불이 났다. • 고양이가 임신했다. • 프로그램이 잘 동작한다. • 답이 잘못된 것이 없다.
  • 5. Example 1. 답이 잘못된게 없음 1 2 3 4 5 6 int main () { int arr [] = { 0, 2, 4, 6, 8 }; int i = 1; cout << i + arr[++i] + arr[i++] << endl; } 컴파일 잘 됨 에러 안남 문법적인 에러는 없음 근데 컴파일러마다 값이 다름 같은 코드인데 값이 다름 고객에게 들고갔을때 값이 다를 수도 있다는 얘기 gcc ++ 10 clang c++ 10
  • 6. 미정의 행동을 만드는 법 • 부호 있는 integer의 overflow(unsigned int 아님) • Malloc 값이 0인 포인터나 NULL인 포 인터를 가리킴 • 피연산자의 값의 범위보다 같거나 더 큰 shift 연산 • 초기화 되지 않은 값 읽기 • 표현식을 한번 이상 수정하기
  • 7. 미정의 행동을 만드는 법 • 버퍼 overflow • 두개의 다른 데이터 구조체 포인터 비 교하기(ex. Array 랑 list랑 비교) • 포인터 overflow • Const 로 선언된 객체 수정하거나 string 문자열 수정하기
  • 8. 미정의 행동을 만드는 법 • -INT_MIN(#define INT_MIN (-2147483647 - 1), bit연산시 –연산하면 값이 정 확하지 않을수 있음 참고 : http://stackoverflow.com/questions/8511598/large-negative-integer- literals) • Data race(멀티스레드가 같은 데이터를 이용하고 다른스레드에서 업데이트 할때 발생, 서로 다른 스레드에서 데이터 동기화에 실패함 그래서 락 걸고 접근해서 데이터 수정해야함) • New랑 delete랑 쌍이 맞지 않음 • 파일을 읽기도 전에 씀 – 버퍼에 쓰기도 전에 값을 복사함 대부분은 컴파일 타임에 에러 발생, Data race 빼고
  • 9. 야호! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <new> class Foo {}; // complicated class int main() { Foo* p[4]; for (int i = 0; i < 4; ++i) { p[i] = new Foo(); } // ..much later.. delete p; //포인터 배열 어디감… return 0; }
  • 10. atomic is lock free C++ - N3691(C++ 14) 20.9.2.5 shared_ptr atomic access Concurrent access to a shared_ptr object from multiple threads does not introduce a data race if the access is done exclusively via the functions in this section and the instance is passed as their first argument. Atomic을 사용하면 Data Race를 방지할 수 있음
  • 11. 산술연산 5 - 4 If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined -> 컴파일 하는 동안 결과가 type의 범위를 넘어가는 경우는 미정의 행동이 다. [ Note: most existing implementations of C++ ignore integer overflows. Treatment of division by zero, forming a remainder using a zero divisor, and all floating point exceptions vary among machines, and is usually adjustable by a library function. — end note ] ->C++에서는 int의 overflow를 무시하기 때문에 0으로 나눈다던지 제수가 0이라던지 부동 소수점의 예외처리는 시스템마다 다르기 때문에 사용하면 안된다.
  • 12. Example 2. 답이 잘못된게 없음 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> #include <stdbool.h> int _tmain(int argc, _TCHAR* argv[]) { bool b; if (b) printf("truen"); if (!b) printf("falsen"); return 0; } 컴파일 잘 됨 에러 안남 (vs 는 남(똑똑)) 근데 컴파일러마다 값이 다름 B가 뭐로 초기화 될지 모르기 때문
  • 13. 왜 C++, C는 이모양이죠? • 미 정의 행동을 하게 되면 컴파일러가 체크를 할 때 작은 코드를 생성할 여지 를 주게 된다. • 미정의 행동을 하지 않으면 컴파일러 는 더 빠르고 간단하게 코드를 컴파일 할 수 있게 된다.
  • 14. 미 정의 행동을 안 하는것이 왜 중요한데? • 컴파일러가 미정의 행동이라는 사실을 알기 때문에, 그래서 최적화에 도움이 된다. • 다른 컴퓨터에서 실행할 때 같은 결과를 낼 수 있다. • 미정의 행동은 잘못된 답이다!!!
  • 15. 다른 관점으로 생각하면 • 미정의 행동이 없으면 input이 뭐든 상관 없다. • 어떤 미정의 행동은 모든 input을 처 리 할 수 있다. • 미정의 행동은 input에 상관없이 항상 일어난다.
  • 16. Example 3. 컴파일 잘 됨 에러 안남 Malloc 실패하면 어쩔껀데...?? 1 2 3 4 5 6 7 8 9 10 11 12 int* do_someting(int *p) { printf("do_something %d n", *p); if (!p) { // code here p = (int *)malloc(...); // more code here } return p; }
  • 17. Example 4. 컴파일 잘 됨 에러 안남 부호 있는 integer의 overflow는?? 1 2 3 4 5 6 7 8 9 10 11 12 13 int _tmain(int argc, _TCHAR* argv[]) { int i = 0x10000000; int c = 0; do { c++; i += i; printf("%dn", i); } while (i > 0); printf("%d iterationsn", c); }
  • 18. 왜 신경써야 하나? • 미 정의 행동 코드를 짜기 엄청 쉽다. • 컴파일러가 업그레이드 되거나 최적화 가 잘 되어 있으면 미정의 행동 코드는 잠깐은 잘 될 수도 있다. • 미 정의 행동은 교묘한 코드에 나타나 니 자주 코드 보안을 체크할것
  • 20. 난 그러면 어떻게 해야 하나 • 미정의 행동을 항상 인식해라 • 컴파일러를 비난하지 마라 • 결과가 뭐가 좀 이상하면 미정의행동 에 대해 생각해 볼것 • 여러 컴파일러를 통해서 컴파일 해 비 교해볼것
  • 21. 빌드한 후에 미정의 동작을 만나면 • 이미 늦음 • 이미 프로그램 죽었을껄...
  • 22. 만약에 이런 코드를 작성했다면 Bool WillThisOverflow(int a) { return a + 100 < a; } 컴파일러는 최적화를 이렇게 할것이다 Bool WillThisOverflow(int a) { return false; } 따라서 이렇게 작성하라 Bool WillThisOverflow(int a) { return a < (INT_MAX – 100); }
  • 23. 미정의 행동을 찾아주는 tool • 은 나타나기 시작했다. • Clang은 –fsanitize = undefine를 사 용하면 된다. – http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html • John Regehr's Integer Overflow Checker • STACK (this past summer from MIT)