Re: [HACKERS] Win32 WEXITSTATUS too
От | Takayuki Tsunakawa |
---|---|
Тема | Re: [HACKERS] Win32 WEXITSTATUS too |
Дата | |
Msg-id | 023b01c73e9a$01e885d0$19527c0a@OPERAO обсуждение исходный текст |
Ответ на | Re: [HACKERS] Win32 WEXITSTATUS too (Bruce Momjian <bruce@momjian.us>) |
Ответы |
Re: [HACKERS] Win32 WEXITSTATUS too
|
Список | pgsql-patches |
From: "Bruce Momjian" <bruce@momjian.us> > OK, I have tested on MinGW and found I can use FormatMessage() to print > a description for all ERROR* system() failures, rather than print a hex > value. This removes the need for a URL or lookup of hex values. > Attached and applied. Excuse me if I'm misunderstanding, but I'm afraid you are mixing up Win32 error codes and exception codes. I saw the following fragment in your patch: ! * On MinGW, system() returns STATUS_* values. MSVC might be ! * different. To test, create a binary that does *(NULL), and ! * then create a second binary that calls it via system(), ! * and check the return value of system(). On MinGW, it is ! * 0xC0000005 == STATUS_ACCESS_VIOLATION, and 0x5 is a value ! * FormatMessage() can look up. GetLastError() does not work; ! * always zero. Exception codes and error codes are different and not related. In the above test, 0xC0000005 is an "exception code". On the other hand, what FormatMessage() accepts is an error code. Error codes can't derived from exception codes. Stripping off 0xC bit from an exception code does not convert it to an error code. I suspect the reason why you misunderstood is that the descriptions are similar: the description for exception 0xC0000005 (STATUS_ACCESS_VIOLATION) is "access violation" (though the text can't be obtained). This is caused by an illegal memory access. This is a program bug. The description for 0x5 (ERROR_ACCESS_DENIED) is "Access is denied." This is caused by permission checks. This is not a bug, and can happen normally. Try "1.0 / 0.0" (devide by zero) instead of (*NULL). What would your patch display? The exception would be 0xC000008E (STATUS_FLOAT_DIVIDE_BY_ZERO), I think. 0x8E is ERROR_BUSY_DRIVE.
В списке pgsql-patches по дате отправления: