[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#474086: gcc-4.2: Constant optimization for strlen() prints bogus warnings



Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Reportbug-Version: 3.39
X-Debbugs-Cc: philipp.marek@bmlv.gv.at
Package: gcc-4.2
Version: 4.2.3-3
Severity: minor


I try to compile the attached C file via the command 
	$ gcc -Wall -Os -S %

and get several warnings:
	test.c:6: warning: initializer element is not constant
	test.c:6: warning: (near initialization for ‘i’)
	test.c:7: warning: initializer element is not constant
	test.c:7: warning: (near initialization for ‘si’)
	test.c:8: warning: initializer element is not constant
	test.c:8: warning: (near initialization for ‘ci’)
	test.c:11: warning: initializer element is not constant
	test.c:11: warning: (near initialization for ‘s’)

Now all of the strlen() calls get (correctly!) optimized out into 
constants; but why do I get the warnings?

I know that constants used within functions could be done via atstart() 
mechanism or on first function call; but as these lengths are already 
constants in the assembler output, any strlen() overloading wouldn't 
work anyway.


So, as conclusion:
If strlen() is taken as known for constant strings (and optimized 
as such), no warning about its return value being non-constant 
should be given.


Or am I missing some part of the picture?


-- System Information:
Debian Release: lenny/sid
  APT prefers testing
  APT policy: (600, 'testing'), (50, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.22-1-686 (SMP w/1 CPU core)
Locale: LANG=de_AT.UTF-8, LC_CTYPE=de_AT.UTF-8 (charmap=UTF-8) (ignored: LC_ALL set to de_AT.utf8)
Shell: /bin/sh linked to /bin/bash

Versions of packages gcc-4.2 depends on:
ii  binutils            2.18.1~cvs20080103-3 The GNU assembler, linker and bina
ii  cpp-4.2             4.2.3-3              The GNU C preprocessor
ii  gcc-4.2-base        4.2.3-3              The GNU Compiler Collection (base 
ii  libc6               2.7-10               GNU C Library: Shared libraries
ii  libgcc1             1:4.3.0-3            GCC support library

Versions of packages gcc-4.2 recommends:
ii  libc6-dev                     2.7-10     GNU C Library: Development Librari

-- no debconf information

Attachment: test.s
Description: Binary data

#include <string.h>
#include <stdio.h>

#define STG "asdf"

int i=strlen(STG);
static int si=strlen(STG);
const int ci=strlen(STG);

struct { int i; } 
s={ .i=strlen(STG) };

int main(void)
{
	int l=strlen(STG);
	const int cl=strlen(STG);

	printf("local %d, const local %d; global %d, static %d, const %d, struc %d\n", 
			l, cl,
			i, si,ci,
			s.i);

	return 0;
}

Reply to: