컴퓨터활용/유닉스

U2L프로젝트 NULL 이슈

멜번초이 2020. 5. 19. 16:09

유닉스로 개발된 C 소스를 리눅스에서 컴파일만 하고서 돌리면 잘 돌아갈까? 대부분 프로그램들은 잘 돌아가지만 몇몇 코드들은 손을 봐줘야 하는 것들이 있다.

리눅스에서는 sprintf 를 사용할 때도 유닉스와  다르게 동작해서 오류가 발생되는 경우가 있다. 유닉스에서는 멀쩡히 잘 돌아가던 프로그램을 리눅스에서 돌리면 오류가 발생되는 경우로서 sprintf()가 있다.

memset(b, 0x00, sizeof(b));
sprintf(a, "name:%s" , b );
printf("%s\n", a );

 

이런 소스의 경우 b 값이 NULL일 경우 유닉스에서는 아무 것도 찍히지 않는다. name: 이라고만 찍한다. 그러나 리눅스에서는 "(null)" 이라는 문자가 찍히게 되면서 name:(null) 이라고 찍힌다. 리눅스에서는 NULL 값에 대한 처리가 유닉스와 사뭇 다르다. 어떤 경우에는 (nil) 이라고 찍히기도 한다.

프로그램을 애초부터 짜기 시작했으면 이런 것은 맞춰 나가면서 개발했을 텐데 유닉스에서 멀쩡히 잘 돌던 프로그램을 그대로 리눅스로 가지고 와서 컴파일만 해서 돌려놓았을 때 이런 부분에서 다르게 동작되면서 오류를 발생시키는 요인이 된다. 개발자는 이미 떠났고 넘겨 받아 운영하고 있는 입장에서는 이러한 이상 동작에 원인을 찾기가 상당히 어렵다. 미리 이런 사실을 알고 있었다면 원인을 찾아 접근하기가 훨씬 수월할 것이다.

 

<2020.05.19>