Обсуждение: Re: [HACKERS] compile warning in CVS HEAD

Поиск
Список
Период
Сортировка

Re: [HACKERS] compile warning in CVS HEAD

От
Andrew Dunstan
Дата:
Patch attached. Also adds a malloc() check that Neil wanted.

cheers

andrew

Tom Lane wrote:

>Andrew Dunstan <andrew@dunslane.net> writes:
>
>
>>*sigh*
>>
>>
>
>
>
>>my local (linux) man for gettimeofday says this:
>>
>>
>
>
>
>>       struct timeval {
>>               time_t         tv_sec;        /* seconds */
>>               suseconds_t    tv_usec;  /* microseconds */
>>       };
>>
>>
>
>Yeah, but mine (HPUX) says that tv_sec is "unsigned long".  I suspect
>that on Darwin the types disagree as to signedness.
>
>
>
>>We could do what you say, or could we just cast it?
>>
>>
>
>If they really were different types (as in different widths) then
>casting the pointer would be a highly Wrong Thing.  I think copying
>to a local is safer, even if it does waste a cycle or two.
>
>            regards, tom lane
>
>---------------------------(end of broadcast)---------------------------
>TIP 6: Have you searched our list archives?
>
>               http://archives.postgresql.org
>
>
>
Index: src/backend/utils/error/elog.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/error/elog.c,v
retrieving revision 1.128
diff -c -r1.128 elog.c
*** src/backend/utils/error/elog.c    15 Mar 2004 15:56:23 -0000    1.128
--- src/backend/utils/error/elog.c    18 Mar 2004 22:55:44 -0000
***************
*** 1035,1041 ****
--- 1035,1045 ----
      int result_len = 2*NAMEDATALEN + format_len +120 ;

      if (result == NULL)
+     {
          result = malloc(result_len);
+         if (result == NULL)
+             return "";
+     }
      result[0] = '\0';

      if (format_len > 0)
***************
*** 1119,1126 ****
                               localtime(&stamp_time));
                      break;
                  case 's':
                      j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
!                              localtime(&(MyProcPort->session_start.tv_sec)));
                      break;
                  case 'i':
                      j += snprintf(result+j,result_len-j,"%s",
--- 1123,1131 ----
                               localtime(&stamp_time));
                      break;
                  case 's':
+                     stamp_time = (time_t)(MyProcPort->session_start.tv_sec);
                      j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
!                              localtime(&stamp_time));
                      break;
                  case 'i':
                      j += snprintf(result+j,result_len-j,"%s",

Re: [HACKERS] compile warning in CVS HEAD

От
Tom Lane
Дата:
Andrew Dunstan <andrew@dunslane.net> writes:
> Patch attached. Also adds a malloc() check that Neil wanted.

Er, what on God's green earth is elog.c doing malloc'ing stuff at all?
This should be a palloc in the ErrorContext; that's what it's for.
As is, this code is guaranteed to fail under out-of-memory conditions.

            regards, tom lane

Re: [HACKERS] compile warning in CVS HEAD

От
Andrew Dunstan
Дата:

Tom Lane wrote:

>Andrew Dunstan <andrew@dunslane.net> writes:
>
>
>>Patch attached. Also adds a malloc() check that Neil wanted.
>>
>>
>
>Er, what on God's green earth is elog.c doing malloc'ing stuff at all?
>This should be a palloc in the ErrorContext; that's what it's for.
>As is, this code is guaranteed to fail under out-of-memory conditions.
>
>
>

Well, it's a one-off allocation into a static variable, if that makes
any difference. If not, I accept the rebuke :-)

I first published the ancestor of this code many months ago, and nobody
has objected until now. But there is always room for improvement I
guess, including in my own knowledge. I'll be happy to change it if need be.

cheers

andrew


Re: [HACKERS] compile warning in CVS HEAD

От
Bruce Momjian
Дата:
Where are we on this patch?  There was concern about the malloc() but
that can be fixed.

---------------------------------------------------------------------------

Andrew Dunstan wrote:
>
> Patch attached. Also adds a malloc() check that Neil wanted.
>
> cheers
>
> andrew
>
> Tom Lane wrote:
>
> >Andrew Dunstan <andrew@dunslane.net> writes:
> >
> >
> >>*sigh*
> >>
> >>
> >
> >
> >
> >>my local (linux) man for gettimeofday says this:
> >>
> >>
> >
> >
> >
> >>       struct timeval {
> >>               time_t         tv_sec;        /* seconds */
> >>               suseconds_t    tv_usec;  /* microseconds */
> >>       };
> >>
> >>
> >
> >Yeah, but mine (HPUX) says that tv_sec is "unsigned long".  I suspect
> >that on Darwin the types disagree as to signedness.
> >
> >
> >
> >>We could do what you say, or could we just cast it?
> >>
> >>
> >
> >If they really were different types (as in different widths) then
> >casting the pointer would be a highly Wrong Thing.  I think copying
> >to a local is safer, even if it does waste a cycle or two.
> >
> >            regards, tom lane
> >
> >---------------------------(end of broadcast)---------------------------
> >TIP 6: Have you searched our list archives?
> >
> >               http://archives.postgresql.org
> >
> >
> >

> Index: src/backend/utils/error/elog.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/error/elog.c,v
> retrieving revision 1.128
> diff -c -r1.128 elog.c
> *** src/backend/utils/error/elog.c    15 Mar 2004 15:56:23 -0000    1.128
> --- src/backend/utils/error/elog.c    18 Mar 2004 22:55:44 -0000
> ***************
> *** 1035,1041 ****
> --- 1035,1045 ----
>       int result_len = 2*NAMEDATALEN + format_len +120 ;
>
>       if (result == NULL)
> +     {
>           result = malloc(result_len);
> +         if (result == NULL)
> +             return "";
> +     }
>       result[0] = '\0';
>
>       if (format_len > 0)
> ***************
> *** 1119,1126 ****
>                                localtime(&stamp_time));
>                       break;
>                   case 's':
>                       j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
> !                              localtime(&(MyProcPort->session_start.tv_sec)));
>                       break;
>                   case 'i':
>                       j += snprintf(result+j,result_len-j,"%s",
> --- 1123,1131 ----
>                                localtime(&stamp_time));
>                       break;
>                   case 's':
> +                     stamp_time = (time_t)(MyProcPort->session_start.tv_sec);
>                       j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
> !                              localtime(&stamp_time));
>                       break;
>                   case 'i':
>                       j += snprintf(result+j,result_len-j,"%s",

>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
>                http://archives.postgresql.org

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: [HACKERS] compile warning in CVS HEAD

От
Bruce Momjian
Дата:
OK, I talked to Andrew via IM and he says it is fixed in CVS.

---------------------------------------------------------------------------

Andrew Dunstan wrote:
>
> Patch attached. Also adds a malloc() check that Neil wanted.
>
> cheers
>
> andrew
>
> Tom Lane wrote:
>
> >Andrew Dunstan <andrew@dunslane.net> writes:
> >
> >
> >>*sigh*
> >>
> >>
> >
> >
> >
> >>my local (linux) man for gettimeofday says this:
> >>
> >>
> >
> >
> >
> >>       struct timeval {
> >>               time_t         tv_sec;        /* seconds */
> >>               suseconds_t    tv_usec;  /* microseconds */
> >>       };
> >>
> >>
> >
> >Yeah, but mine (HPUX) says that tv_sec is "unsigned long".  I suspect
> >that on Darwin the types disagree as to signedness.
> >
> >
> >
> >>We could do what you say, or could we just cast it?
> >>
> >>
> >
> >If they really were different types (as in different widths) then
> >casting the pointer would be a highly Wrong Thing.  I think copying
> >to a local is safer, even if it does waste a cycle or two.
> >
> >            regards, tom lane
> >
> >---------------------------(end of broadcast)---------------------------
> >TIP 6: Have you searched our list archives?
> >
> >               http://archives.postgresql.org
> >
> >
> >

> Index: src/backend/utils/error/elog.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/error/elog.c,v
> retrieving revision 1.128
> diff -c -r1.128 elog.c
> *** src/backend/utils/error/elog.c    15 Mar 2004 15:56:23 -0000    1.128
> --- src/backend/utils/error/elog.c    18 Mar 2004 22:55:44 -0000
> ***************
> *** 1035,1041 ****
> --- 1035,1045 ----
>       int result_len = 2*NAMEDATALEN + format_len +120 ;
>
>       if (result == NULL)
> +     {
>           result = malloc(result_len);
> +         if (result == NULL)
> +             return "";
> +     }
>       result[0] = '\0';
>
>       if (format_len > 0)
> ***************
> *** 1119,1126 ****
>                                localtime(&stamp_time));
>                       break;
>                   case 's':
>                       j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
> !                              localtime(&(MyProcPort->session_start.tv_sec)));
>                       break;
>                   case 'i':
>                       j += snprintf(result+j,result_len-j,"%s",
> --- 1123,1131 ----
>                                localtime(&stamp_time));
>                       break;
>                   case 's':
> +                     stamp_time = (time_t)(MyProcPort->session_start.tv_sec);
>                       j += strftime(result+j, result_len-j, "%Y-%m-%d %H:%M:%S",
> !                              localtime(&stamp_time));
>                       break;
>                   case 'i':
>                       j += snprintf(result+j,result_len-j,"%s",

>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
>                http://archives.postgresql.org

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073