why was the VAR 'optind' never changed in initdb?

From: Clover White <mywhiteclover(at)gmail(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: why was the VAR 'optind' never changed in initdb?
Date: 2012-04-09 11:38:46
Message-ID: CAEwsEE48V3aa7oPQhNBz3S28rABbXuTasOGDPf=hoRVJy2A4fw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,
I'm debugging initdb using gdb.
I found that I could not step in the function getopt_long in line 2572 in
initdb.c.
I also found that the value of VAR optind never be changed. VAR optind is
always equal to 1 but how could optind be larger than the value of argc(the
value of argc is 6) in line 2648 and 2654.

I was so confused. Could someone give me some help? Thank you~

here is my configure:
./configure CFLAGS=-O0 --enable-debug --enable-depend --enable-cassert
--prefix=/home/pgsql/pgsql

follows is my debug log by gdb:

[pgsql(at)vmlinux postgresql-9.1.2]$ gdb initdb
GNU gdb Red Hat Linux (6.3.0.0-1.63rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host
libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) set args -U pgsql -W -D /home/pgsql/pg_data
(gdb) b main
Breakpoint 1 at 0x804d133: file initdb.c, line 2553.
(gdb) b 2572
Breakpoint 2 at 0x804d20c: file initdb.c, line 2572.
(gdb) run
Starting program: /home/pgsql/pgsql/bin/initdb -U pgsql -W -D
/home/pgsql/pg_data

Breakpoint 1, main (argc=6, argv=0xbfec0ad4) at initdb.c:2553
2553 progname = get_progname(argv[0]);
(gdb) c
Continuing.

Breakpoint 2, main (argc=6, argv=0xbfec0ad4) at initdb.c:2572
2572 while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:",
long_options, &option_index)) != -1)
(gdb) p optind
$1 = 1
(gdb) s
2574 switch (c)
(gdb) n
2589 username = xstrdup(optarg);
(gdb)
2590 break;
(gdb) p optind
$2 = 1
(gdb) n

Breakpoint 2, main (argc=6, argv=0xbfec0ad4) at initdb.c:2572
2572 while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:",
long_options, &option_index)) != -1)
(gdb) p optind
$3 = 1
(gdb) n
2574 switch (c)
(gdb) p optind
$4 = 1
(gdb) n
2586 pwprompt = true;
(gdb)
2587 break;
(gdb)

Breakpoint 2, main (argc=6, argv=0xbfec0ad4) at initdb.c:2572
2572 while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:",
long_options, &option_index)) != -1)
(gdb) p optind
$5 = 1
(gdb) n
2574 switch (c)
(gdb)
2580 pg_data = xstrdup(optarg);
(gdb) p optarg
$6 = 0x0
(gdb) n
2581 break;
(gdb) p optarg
$7 = 0x0
(gdb) n

Breakpoint 2, main (argc=6, argv=0xbfec0ad4) at initdb.c:2572
2572 while ((c = getopt_long(argc, argv, "dD:E:L:nU:WA:sT:X:",
long_options, &option_index)) != -1)
(gdb) p pg_data
$8 = 0x9d328e8 "/home/pgsql/pg_data"
(gdb) n
2648 if (optind < argc)
(gdb) p optind
$9 = 1
(gdb) p argc
$10 = 6
(gdb) n
2654 if (optind < argc)
(gdb) p optind
$11 = 1
(gdb) p argc
$12 = 6
(gdb) n
2663 if (pwprompt && pwfilename)
(gdb)

--
Clover White

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrew Dunstan 2012-04-09 12:49:44 Re: why was the VAR 'optind' never changed in initdb?
Previous Message Ashutosh Bapat 2012-04-09 11:19:59 Potential for bugs while using COPY_POINTER_FIELD to copy NULL pointer