Secure Coding in C - floating point, 배열

markyang92·2021년 6월 20일
0

Secure Coding in C

목록 보기
4/7

floating point 문제

  • floating point 정밀도는 Arch, compiler 최적화 레벨에 따라 다르다.

ARCH마다 다른 결과

  • 아래의 코드는 시스템에 따라 다른 결과 출력
    1. 64bit Linux, gcc 4.1 version
      result = 0.33333334326744079589843750000000000000000000000000
    2. 64bit Windows, visual studio 2012
      result = 0.33333334326744080000000000000000000000000000000000

compiler 최적화 레벨에 따라 다른 결과

  • 아래의 코드는 컴파일러의 최적화 레벨에 따라 다른 결과 보임


오차 누적

1. 부적절한 코드

  • 다음 코드는 부동소수점의 부정확성 때문에 계산 결과에서 오차 발생 가능



1. 해결 방법

  • floating point를 정수로 변경해 해결



루프 카운터 사용 X

  • 부동 소수점 변수를 루프 카운터로 사용하지 말 것

1. 부적절한 코드

  • 다음 코드는 경우에 따라서 9번만 실행될 수 있다.


/ 연산 시 floating point 주의

  • 계산 시 정수를 사용해 부동 소수점 변수에 값을 할당한 경우 정보 손실
  • 표현식의 정수 중 하나를 부동 소수점 타입으로 변환해 피할 수 있다.

1. 부적절한 코드

  • 정수 타입의 연산 결과는 항상 정수
  • 부동 소수점 결과가 나왔을 경우, 소수 부분은 잘려 나갈 수 있다.


    그냥 나누면 오답!

1-1. 해결 방법

  • 피연산자 하나를 부동 소수점으로 표기


1-2. 해결 방법

  • 정수 값을 부동소수점 변수에 저장하여 처리


floating point 오버플로우

  1. 부동 소수점 값이 더 작은 범위더 작은 정밀도를 가진 부동 소수점 값으로 변환
  2. 부동 소수점 값이 정수로 변환되는 경우

변환될 타입으로 표현 가능해야한다.


overflow check

정수 부분 체크

  • 부동소수점의 정수 부분 오버플로우 체크

float 부분 체크


  • 변환되는 값이 새로운 타입으로 표현될 수 있는지 검사


배열

  • size_t, ssize_t를 잘 활용하자
#include <stdio.h>

ssize_t* arr[];
ssize_t arr[100];

배열 idx

배열 idx 음수 방지

해결 방법 1

  • idx 음수도 거르자


해결 방법 2

  • 아예 idx에 음수가 못오게 unsigned 정수
  • size_t 배열 길이


일관된 배열 표기 사용

  • 어디서는 int arr[], 어디서는 int* arr하지말자.

1. 부적절한 코드

  • 일관된 배열 선언하지 않으면 unexpected error


1. 해결 방법

  • 일관된 배열 선언하자



가변 배열 길이 주의

idx 벗어남 거르기

  • 길이 idx 벗어남 주의 코드
  1. enum 으로 ARR_SIZE 강제 거르기

더 큰 사이즈 요구

  • 항시, 더 큰 길이를 요구 할 수 있다는 것도 감안

    더 큰 사이즈 요구되면, memcpy 등 사용
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글