libDtHelp is unable to read SDL help files
with -ftree-store-ccp optimization which
is enabled by -O2 on gcc 4.2.1.
GifUtils.c and decompress.c didn't work
properly with -ftree-store-ccp enabled.
GifUtils.c was repaired by fixing
those warnings:
GifUtils.c: In function 'create_pixmap':
GifUtils.c:1093: warning: return makes integer from pointer without a cast
GifUtils.c:1110: warning: return makes integer from pointer without a cast
GifUtils.c:1215: warning: return makes integer from pointer without a cast
GifUtils.c: In function 'gif_to_pixmap':
GifUtils.c:1242: warning: return makes integer from pointer without a cast
decompress.c didn't generate warnings, but the
only effect of the -ftree-store-cpp was to introduce
this change:
addq $1, %rax
movq %rax, (%rbx)
.L90:
- cmpl $157, %edx
+ cmpl $-99, %edx
jne .L86
movl 8(%rbx), %eax
subl $1, %eax
Which corresponds to this source code:
bufioI.h
57 #define BufFileGet(f) ((f)->left-- ? *(f)->bufp++ : (*(f)->io) (f))
42 int (*io)(/* BufFilePtr f */);
decompress.c
53 #ifdef NO_UCHAR
54 typedef char char_type;
55 #else
56 typedef unsigned char char_type;
57 #endif /* UCHAR */
58
59 static char_type magic_header[] = { "\037\235" }; /* 1F 9D */
131 if ((BufFileGet(f) != (magic_header[0] & 0xFF)) ||
132 (BufFileGet(f) != (magic_header[1] & 0xFF)))
133 {
134 return 0;
135 }
BufFileGet() returns (int), so the (unsigned char) constants
got promoted to (int) with sign extension; therefore constant
157 decimal (0x9D) became -99 decimal, sign extended
(0xffffff9D), and the comparison was always false.
Tested using:
$ gcc -v
Using built-in specs.
Target: amd64-undermydesk-freebsd
Configured with: FreeBSD/amd64 system compiler
Thread model: posix
gcc version 4.2.1
20070831 patched [FreeBSD]
Running on:
FreeBSD 10.0-CURRENT (r240948M)
built Wed Sep 26 23:33:08 CEST 2012
if (!ximData) {
fprintf(stderr, "Could not allocate ximage data\n");
- return NULL;
+ return None;
}
/* Monochrome */
if (!g->f_ximage) {
fprintf(stderr, "XCreateImage failed\n");
- return NULL;
+ return None;
}
if (!pm) {
fprintf(stderr, "could not create pixmap\n");
- return NULL;
+ return None;
}
_XmPutScaledImage (g->f_dpy,pm,g->f_gc,g->f_ximage,
/* Create raw image from compress GIF data */
raw_image = create_raw_image (inbuf, buflen, &width, &height, 1);
- if (!raw_image) return NULL;
+ if (!raw_image) return None;
/* Create X pixmap from raw image data */
pixmap = create_pixmap(g, raw_image, width, height, fg, bg, ratio);
typedef unsigned char char_type;
#endif /* UCHAR */
-static char_type magic_header[] = { "\037\235" }; /* 1F 9D */
+static int magic_header[] = { 0x1F, 0x9D };
/* Defines for third byte of header */
#define BIT_MASK 0x1f
CompressedFile *file;
int extra;
- if ((BufFileGet(f) != (magic_header[0] & 0xFF)) ||
- (BufFileGet(f) != (magic_header[1] & 0xFF)))
+ if ((BufFileGet(f) != magic_header[0]) ||
+ (BufFileGet(f) != magic_header[1]))
{
return 0;
}