warning 이 났는데.. 도데체 없어지지를 않네요

hany93의 이미지

32비트 HP 장비에서 잘 쓰던 소스를 64비트 머신으로 가져와서 옵션주고 라이브러리로 컴파일 하고 있는중인데요

cc: "profile.c", line 49: warning 724: Cast converts default int return type to
pointer.

이런 워닝이 나는데.. 49줄에 써 있는 내용이 먼가하면

상략
    char t_buf[__BUF_LEN], *t_ptr;
    char *lasts;
중략
    if ((t_ptr = (char *)strtok_r(t_buf, __DELIMITER, &lasts)) != NULL)
하략

입니다. man 페이지에서 제시한 string.h 헤더를 인크루드 했는데도 위의 워닝이 없어지지 않을뿐 아니라.. 워닝이 난 상태의 라이브러리를 그냥 쓰니깐. 위의 줄에서 죽어버리는군요 (메모리 폴트로요) 문법상의 오류 같지는 않은데..
혹시 이런 경우를 해결해 보신 회원님 계신가요?

컴파일 옵션은

CFLAGS          = -O -c $(INCLUDE) -Aa -D_HPUX_SOURCE +DA2.0W +DS2.0 +e

를 사용하였습니다. 장비는 HP 머신이구요

datamind의 이미지

strtok_r 함수가 변형된것 같습니다.
아마도 위치 값을 리턴하는 것 같네요..
아래와 같이 사용하여 보세요.. -.-;;

if ((t_ptr = (char *)strtok_r(t_buf, __DELIMITER, &lasts)) != NULL) 

===>

strtok_r(t_buf, __DELIMITER, &lasts);
if ( lasts != NULL ) 

최종호의 이미지

지금 HP 쪽에 로그인을 못해서 확인이 힘들지만,,

컴파일하실 때 -D_REENTRANT 나 -D_HPUX_SOURCE,
-D_POSIX_C_SOURCE=199506L, -D_XOPEN_SOURCE
같은 것을 주셔서 다시 해 보세요.

/usr/include/string.h 를 열어서 strtok_r 부분을 살펴보시면
#if defined(..) ...
#endif
로 MT 환경에서만 컴파일되도록 막혀있을 수도 있습니다.
(플랫폼에 따라서 틀립니다.)

워닝 메시지도 아마 함수 프로토타입이 알려지지 않은상태에서
기본으로 int 를 리턴값으로 생각했는데, 이를 char * 로 casting
하니까 발생한 것으로 보입니다.

hany93의 이미지

데이터마인드 님과 최종호 님의 조언 감사합니다.

일단 소스를 안고치고 -D_REENTERANT 옵션으로 컴파일이 되긴 했는데요
strtok_r 을 사용한 아래의 샘플 프로그램에서는 64비트 옵션으로 컴파일 했을때에도 무사히 컴파일 됬는데.. 만약에 옵션에서 그랬다면 샘플프로그램에서도 컴파일이 안되고 워닝이 났어야 할 것 같은데요...

#include <stdio.h>
#include <string.h>

int testfunc()
{
    char *str="ASDFB:ADFGDF:";
    char *pos;

    pos = str;
    printf("%s\n", strtok_r(str,":",&pos));
    printf("%s\n", strtok_r(NULL,":",&pos));

    return 1;
}

위의 코드는 _REENTERANT 옵션 없이도 아무 문제 없이 컴파일 됬거든요
어떤 차이가 있을까요? 사용한 것은 똑같은데.. 워닝이 났던것은 여러개의 함수가 묶인 것 뿐이고.. strtok_r 썼던부분은 어차피 위의 예제와 같이 딱 한군데였는데.. 음.. 뭘까요???

kslee80의 이미지

printf() 의 경우에는 가변 인자 리스트를 사용하는 함수죠.
최근의 gcc 의 경우에는 printf() 의 경우에는 format 스트링과
뒤에 따라오는 아규먼트들의 타입을 체크해 주지만,
예전의 컴파일러들은 그런 기능이 없었죠.

실제로 printf() 의 함수 prototype 을 보시면 알겠지만,
(char *fmt, ...) 으로 되어 있어서
일반적으로는 Type-checking 이 되질 않죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.