comp.lang.ada
 help / color / mirror / Atom feed
* Memory overwrite?
@ 1995-01-24 12:47 R.A.L Williams
  1995-01-25 16:31 ` Robert A Duff
                   ` (3 more replies)
  0 siblings, 4 replies; 15+ messages in thread
From: R.A.L Williams @ 1995-01-24 12:47 UTC (permalink / raw)


In article <1995Jan18.182039.7324@wdl.loral.com> Mark Biggar wrote:

[original post and a reply deleted]

: Actually the most likely reason for this is an uninitialized variable used
: as an array index.  In Ada 83 the following code fragment can write anywhere
: in memory and may well not raise an exception:

: declare
: 	subtype index is integer range 1..10;
: 	type table is array (index) of integer;
: 	a: table;
: 	i: index;
: begin
: 	a(i) := 0;
: end;

: An aggressive optimizer will eliminate any checks from the above code.
: Even putting an explisit if statement around it doesn't help:

OK, I can see how an optimiser *could* do that, and, of course, RM9x
section 3.3.1 says that 'There is no implicit initial value defined
for a scalar subtype ... might have a value which does not belong to
that subtype' (para 21). I'm a little suprised, however, that the
compiler isn't expected to perform a simple data flow analysis and
generate a warning about use of uninitialised variables. You're quite
right though, I can't find anything in RM9x which says it should, and
I'm pretty sure there was nothing in the Ada83 LRM.

: 	if i in index then
: 		a(i) := 0;
: 	else
: 		raise constraint_error;
: 	end if;

: because an aggressive optimizer will notice that the if test is always true
: (in the absence of uninitialized variables, but uninitialized variables
: are erroneous, which allow any behaviour, so it can ignore the problem)
: and eliminate the test and the else branch completely.

GCC can tell me about the possible use of uninitialised variables. It 
produces a warning because the analysis is not sophisticated enough to
follow all the possible paths. Can GNAT do this as well ? Perhaps I'll
try your example out with GNAT and see what it does.

: Ada95 add the 'valid attribute to handle this problem.

Yes, this is a good idea. In another thread I've been gently pushing
the notion that use of Ada does not eliminate the use of good SWE principles.
It looks like you've found another example of where the sort of error
that other languages are always being blamed for can occur in Ada.

: --
: Mark Biggar
: mab@wdl.lroal.com

Bill Williams









^ permalink raw reply	[flat|nested] 15+ messages in thread
* Memory overwrite?
@ 1995-01-26 13:05 R.A.L Williams
  1995-01-27 14:01 ` Robert A Duff
  1995-01-28  5:54 ` Robert Dewar
  0 siblings, 2 replies; 15+ messages in thread
From: R.A.L Williams @ 1995-01-26 13:05 UTC (permalink / raw)


In article <3g6fi6$fuv@gnat.cs.nyu.edu> Robert Dewar wrote:
: Mark asks if GNAT can also find uninitialized variables, like GCC.

No, actually it was me

: GNAT IS GCC! Use the GCC option, and you will get the output you want!
: \x1a

Well, no! I used these two programs...

with GNAT.IO; 
use GNAT.IO;

procedure CRASH is
  subtype CONSTRAINED_INT is INTEGER range 2 .. 5;
  I : INTEGER;
  J : CONSTRAINED_INT;
  X : array(CONSTRAINED_INT) of INTEGER;
begin
  for I in CONSTRAINED_INT'RANGE loop
    X(I) := I * 2;
    PUT(I); PUT(" : "); PUT(X(I)); NEW_LINE;
  end loop;
  PUT_LINE("The next command may cause a CONSTRAINT_ERROR");
  PUT(J); PUT(" : "); PUT(X(J)); NEW_LINE;
end;

compiled with 'gnat -c -O -Wuninitialized crash.adb' gave no
errors and no warnings; whereas

#include <stdio.h>

main()
{
  int i, j, x[4];

  for (i = 0; i < sizeof(x)/sizeof(int); i++)
  {
    x[i] = (i + 2) * 2;
    printf("%d : %d\n", i, x[i]);
  }
  printf("The next statement may cause a crash\n");
  printf("%d : %d\n", j, x[j]);
}

compiled with 'gcc -O -Wuninitialized -o crash-c crash-c.c'
told me:
  crash-c.c: In function `main':
  crash-c.c:5: warning: `j' might be used uninitialized in this function

Obviously this is a compiler issue, NOT a language issue. There is
no reason that I know of why future versions of GNAT shouldn't generate
similar warnings in these circumstances.

Interestingly, the -Wuninitialized option only works when optimization
is enabled. Does this imply that there isn't much optimization in
GNAT yet. (Can't complain, it is free and available and you cant say that
about any other Ada95 compilers).

Bill Williams




^ permalink raw reply	[flat|nested] 15+ messages in thread
* Memory overwrite?
@ 1995-01-13  8:35 Rick Wouters
       [not found] ` <3fe5cp$fnq@theopolis.orl.mmc.com>
  0 siblings, 1 reply; 15+ messages in thread
From: Rick Wouters @ 1995-01-13  8:35 UTC (permalink / raw)



	An Ada program which compiles correctly and which does not produce
	run-time errors seems to overwrite memory.
	No dynamic allocation is used nor are address types used.
	Some records are defined with a length clause.

	Environment: VADS 6.0 on Sun4

	Does anyone know a reason which might result in overwriting memory
	in a correctly compiled program?


Because I'm posting this for a good friend, please send reply to:

	dc691@hgl.signaal.nl


Thanks,

Rick.




^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~1995-02-01 23:00 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1995-01-24 12:47 Memory overwrite? R.A.L Williams
1995-01-25 16:31 ` Robert A Duff
1995-01-25 19:01 ` Tucker Taft
1995-01-25 21:24 ` Robert Dewar
1995-01-30 17:06 ` Theodore E. Dennison
1995-02-01 12:25   ` Robert Dewar
  -- strict thread matches above, loose matches on Subject: below --
1995-01-26 13:05 R.A.L Williams
1995-01-27 14:01 ` Robert A Duff
1995-01-28 22:49   ` Robert Dewar
1995-01-30 14:16     ` Robert A Duff
1995-02-01 23:00       ` Matt Kennel
1995-01-28  5:54 ` Robert Dewar
1995-01-13  8:35 Rick Wouters
     [not found] ` <3fe5cp$fnq@theopolis.orl.mmc.com>
1995-01-18 18:20   ` Mark A Biggar
1995-01-20  5:19     ` Robert Dewar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox