GCC 기반툴( SW4STM32 등) 에서 컴파일러 셋팅에 있는 Optimization 설정(아래그림)에 따라 프로그램 작동결과가 심각하게 다른 결과가 나오는 경우 있다. 특히 float 형 변수 사용하는 경우 옵션에 따라 황당한 결과를 주는 경우가 많음. 

 

 

위 그림은 SW4STM32 화면에서 optimization 부분인데, 프로젝트 생성초기 기본 값은 -Og 가 선택된 상태이다. 

 

옵션 -O1, -O3 -Og  상태로 "float 형변수의 메모리 1바이트 단위로 접근하는 처리" 실행시켜보면, 엉뚱한 결과를 준다. 

 

 

오류없이 정상적으로 실행되는 옵션 : 상기 Optimization 옵션을 적용하지 않는 None, 혹은 -Os, -O1 을 선택하면 정상 작동한다. 

 

 

컴파일 옵션에 따른 오류의 실예. 

옵션 : None, -Os, -O2 인 경우 아래 파형은 float 변수 사용중인 시계열 데이터가 정상적으로 처리된 경우의 데잍터 챠팅 모습, 

 

 

옵션 : -O1, -O3 -Og 인 경우. 아래 처럼 엉망의 결과를 보임. 개 쓰레기.... 이렇게 엉망으로 만드는걸 옵션에 넣어둔 발상이 뭐임?

 

 

결론. 

GCC 기반 개발시 컴파일 optimization 옵션 필수 확인하고, 

특히 실수 사용되는 수치처리 등에서는 특히 위험성 심각하다. 의심스럽다면 None 선택할것. 

 

 

참고. 

KEIL 이나 Visual C++ 등의 컴파일러에서는 위와 같은 이상한 특성 본적없음. 

 

 

연관 

 

 

float 형 변수에 할당된 4바이트 메모리의 각 바이트 단위로 접근하는법.

문제. 변수 선언이 float f_value; 처럼 float 으로 선언되어있어서, 통상적인 실수값을 이 변수에 대입(예 f_value = 3.789f )하여 실수로 활용하지 않고, f_value 에 할당된 메모리 4바이트들의 각 바이트들에..

igotit.tistory.com

 


첫등록 : 2019년 2월 20일

최종수정 : 2020년 1월13일 

 

단축주소 : https://igotit.tistory.com/2084

 


 

 

Posted by 리치굿맨

댓글을 달아 주세요