php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #7474 ext/standard/scanf.c reports strtol/strtoul "undefined reference"
Submitted: 2000-10-26 00:07 UTC Modified: 2001-07-31 03:13 UTC
From: widman at cardiothink dot com Assigned:
Status: Closed Package: Compile Failure
PHP Version: 4.0.5 ? OS: SunOs 4.1.4 (!)
Private report: No CVE-ID: None
 [2000-10-26 00:07 UTC] widman at cardiothink dot com
SunOs 4.1.4 has strtol (at least, the man page for it). And,
ext/mysql/libmysql has a replacement for strtol/strtoul.

But, the "out of the box" compile fails in ext/standard/scanf.c with the complaint: strtol/strtoul are "undefined references".  I tried to cut and paste from the files in ext/mysql/libmysql but got a zillion compiler errors.

Then, I added the following to the start of scanf.c based on the SunOs man page:
  long strtol( char *str, char **ptr, int base );
  ulong strtoul( char *str, char **ptr, int base );
The compile succeeded, but complained that these functions had been defined as int implicitly in ./Zend/zend_operators.c.  I then changed the added lines to
  int strtol( char *str, char **ptr, int base );
  int strtoul( char *str, char **ptr, int base );
These lines allowed the file to compile without warnings,
and the rest of the php4 compile proceeded smoothly.  I guess I'll just have to see whether I should have gone through the entire package and defined these functions as long/ulong everywhere instead of making them "int" in this one file.

I don't know how best to handle this idiosyncracy in the php4 package.  I searched everything in /usr/include for definitions of strtol and strtoul, but couldn't find any files that define them.  Maybe you could include a short .h file with these definitions, or add them to a global file for those systems that don't define these right.

Thanks for all your hard work! - Larry Widman

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2000-10-26 00:42 UTC] widman at cardiothink dot com
I went through and found all the files that use strtol without type-casting.  They are:
 ./ext/dbase/dbase.c
 ./ext/session/mod_files.c
 ./ext/standard/formatted_print.c
 ./ext/standard/scanf.c
 ./ext/standard/string.c
 ./ext/wddx/wddx.c
 ./main/fopen-wrappers.c
 ./main/php_ini.c
 ./sapi/nsapi/nsapi.c
 ./Zend/zend_operators.c
 ./Zend/zend_operators.h
 ./Zend/zend-scanner.c  
I added the first set of function prototypes in my first message (the ones that are commented out) to each of the above files, except that the last 3 files required "ulong" to be spelled out as "unsigned long" for strtoul.  The others took ulong OK.

The compile was successful.  Now let's see if php4 works.  I'm sending this now because it may take a while for any bugs related to this fix to appear.

Thanks again for your hard work.  I hope these comments help the next poor soul who is still working with SunOs 4.1.4.
 [2000-12-18 10:44 UTC] sniper@php.net
Does this happen with latest snapshot from http://snaps.php.net/ ??

--Jani
 [2001-01-16 08:03 UTC] widman at cardiothink dot com
I just tried to compile 4.0.4pl1 and it failed the same way:
gcc  -I. [snip] -c scanf.c && touch scanf.lo
scanf.c: In function `php_sscanf_internal':
scanf.c:783: `strtol' undeclared (first use this function)
scanf.c:783: (Each undeclared identifier is reported only once
scanf.c:783: for each function it appears in.)
scanf.c:804: `strtoul' undeclared (first use this function)
*** Error code 1                                                  

I'll try a snapshot next.  Thanks - Larry
 [2001-01-16 19:50 UTC] widman at cardiothink dot com
The snapshot of 200101160445 failed to compile with the same error as that of 4.0.4pl1.
 [2001-05-23 02:04 UTC] sniper@php.net
I guess this still happens with PHP 4.0.5 too?

--Jani

 [2001-06-02 20:51 UTC] sniper@php.net
If you don't mind, please test latest release candidate:

http://www.php.net/~andi/php-4.0.6RC2.tar.gz

I'm pretty sure it happens with it too, but I'd like 
to be sure about it.

-Jani

 [2001-06-18 20:13 UTC] sniper@php.net
This was said to happen still with 4.0.5 and the code
in question hasn't changed (IIRC) much since.

One possible solution is to add some #ifdef's around
these functions, and checks for existance of strol/stroul
into configure

 [2001-07-31 03:13 UTC] sniper@php.net
As this system in question is really outdated and
shouldn't be used in production anyway (y2k!) we're
not going to add any hacks to fix this now. 

I have made patches to fix this, so if someone
else has the same problem and really wants this
hack, it's available by asking me: sniper@php.net

--Jani

 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Apr 19 03:01:27 2024 UTC