clang -fsanitize=undefined error in ecpg
От | Peter Eisentraut |
---|---|
Тема | clang -fsanitize=undefined error in ecpg |
Дата | |
Msg-id | 551AF0E6.4020900@gmx.net обсуждение исходный текст |
Ответы |
Re: clang -fsanitize=undefined error in ecpg
|
Список | pgsql-hackers |
With clang -fsanitize=undefined (clang-3.4), I get the following test failure in ecpg (it's the only one in the entire tree): --- a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test2.stderr +++ b/src/interfaces/ecpg/test/results/pgtypeslib-dt_test2.stderr @@ -1,2 +1,4 @@[NO_PID]: ECPGdebug: set to 1[NO_PID]: sqlca: code: 0, state: 00000 +dt_common.c:2209:13: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' +dt_common.c:1424:12: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' This happens while parsing these strings: "19990108foobar" "19990108 foobar", "1999-01-08 foobar" "........................Xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" (I'm not sure why it reports two warnings for four cases. Maybe it collapses some warnings.) This patch fixes it: diff --git a/src/interfaces/ecpg/pgtypeslib/dt.h b/src/interfaces/ecpg/pgtypeslib/dt.h index 145e2b7..2ccd0be 100644 --- a/src/interfaces/ecpg/pgtypeslib/dt.h +++ b/src/interfaces/ecpg/pgtypeslib/dt.h @@ -193,7 +193,7 @@ typedef double fsec_t; * Bit mask definitions for time parsing. *//* Copy&pasted these values from src/include/utils/datetime.h*/ -#define DTK_M(t) (0x01 << (t)) +#define DTK_M(t) ((t) == UNKNOWN_FIELD ? 0 : 0x01 << (t))#define DTK_ALL_SECS_M (DTK_M(SECOND) | DTK_M(MILLISECOND)| DTK_M(MICROSECOND))#define DTK_DATE_M (DTK_M(YEAR) | DTK_M(MONTH) | DTK_M(DAY))#define DTK_TIME_M (DTK_M(HOUR) | DTK_M(MINUTE) | DTK_M(SECOND)) Strangely, I cannot reproduce this failure with the backend datetime code that this was supposedly copied from. Comments?
В списке pgsql-hackers по дате отправления: