#2106: Make ParseFile.c more robust -----------------------+---------------------------------------------------- Reporter: eschnett | Owner: Type: defect | Status: reopened Priority: unset | Milestone: Component: Cactus | Version: development version Resolution: | Keywords: -----------------------+----------------------------------------------------
Comment (by rhaas):
Uff, I see. "usual arithmetic conversion" is really murky to me. So I try to err on the side of not relying on it.
I think I would agree with this assessment if the conversion happened in in the if statement. However the actual code is: {{{ static char *ReadFile(FILE *file, unsigned long *filesize) { ... *filesize = ftell(file); if (*filesize < 0) { // do stuff }}} so the result of ftell (a long int) is converted to unsigned long int when it is assigned to *filesize. Since {{{filesize}}} is known to be "unsigned long int" the optimization seems valid to me (namely an unsigned int comparison with <0 will always fail).
The cast of -1 to {{{unsigned long int}}} that I added is just to avoid the warning about comparing signed and unsigned values.
A test code: {{{ void foo() { unsigned int bar = 1; if(bar < 0) { baz(); }
if(bar == -1) { baz(); } } }}} gives me two warnings on gcc 7.3.0 when using -Wextra (but not eg -Wall): {{{ rhaas@ekohaes8:.../rhaas/tmp$ gcc -Wall -Wextra -c compare.c compare.c: In function ‘foo’: compare.c:4:10: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] if(bar < 0) { ^ compare.c:8:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if(bar == -1) { ^~ }}} Note the first warning about the comparison always being false.