View previous topic :: View next topic |
Author |
Message |
pcmoonbeam Beginner
Joined: 21 Nov 2005 Posts: 31 Topics: 10 Location: Orange County, California
|
Posted: Mon Nov 21, 2005 5:49 pm Post subject: zero value in a subscript |
|
|
I have a production COBOL II program in which a subscript reaches a value of zero yet does not cause the program to abend. I have put displays in the code to verify this, because I couldn't believe that the program could continue to execute with a subscript pointing to a zero occurrance. This zero subscript is computed as shown here:
Code: | COMPUTE ELIG-SB = TABLE-SUB - 8. |
It is then used to search a table:
Code: | IF E-MEM-TYPE (ELIG-SB) = ' ' OR '0'
MOVE E-LAST-MEM-TYPE TO E-MEM-TYPE (ELIG-SB)
DISPLAY '22021 E-MEM-TYPE IS CHANGED TO '
E-MEM-TYPE(ELIG-SB). |
Here is the display:
CHG-SUB 05
IN 22021-SKIP-HOURS
TABLE-SUB 07
ELIG-SB BEFORE CALC 02
ELIG-SB AFTER CALC 01
22021 E-MEM-TYPE IS
22021 E-MEM-TYPE IS CHANGED TO B
IN 22020-GET-NEEDED-HOURS.
TABLE-SUB 08
CHG-SUB 05
IN 22021-SKIP-HOURS
TABLE-SUB 08
ELIG-SB BEFORE CALC 01
ELIG-SB AFTER CALC 00
22021 E-MEM-TYPE IS
IN 22020-GET-NEEDED-HOURS.
TABLE-SUB 09
CHG-SUB 05
IN 22021-SKIP-HOURS
TABLE-SUB 09
ELIG-SB BEFORE CALC 00
ELIG-SB AFTER CALC 01
22021 E-MEM-TYPE IS B
How can this be? _________________ Thanks,
PCMOONBEAM |
|
Back to top |
|
|
kolusu Site Admin
Joined: 26 Nov 2002 Posts: 12376 Topics: 75 Location: San Jose
|
|
Back to top |
|
|
pcmoonbeam Beginner
Joined: 21 Nov 2005 Posts: 31 Topics: 10 Location: Orange County, California
|
Posted: Tue Nov 22, 2005 11:22 am Post subject: |
|
|
Thanks Kolusu,
I checked the compile options that we use and wouldn't you know it, NOSSRAGNE is in effect. _________________ Thanks,
PCMOONBEAM |
|
Back to top |
|
|
kolusu Site Admin
Joined: 26 Nov 2002 Posts: 12376 Topics: 75 Location: San Jose
|
Posted: Tue Nov 22, 2005 11:39 am Post subject: |
|
|
pcmoonbeam,
Now are you clear as to why your program did not abend?
Kolusu _________________ Kolusu
www.linkedin.com/in/kolusu |
|
Back to top |
|
|
pcmoonbeam Beginner
Joined: 21 Nov 2005 Posts: 31 Topics: 10 Location: Orange County, California
|
Posted: Tue Nov 22, 2005 12:00 pm Post subject: |
|
|
Yes, crystal clear, thanks!
We are about to embark on a decision in our shop as to whether or not we should change this option to be in effect. If we do, it will have a huge impact when we recompile existing programs. _________________ Thanks,
PCMOONBEAM |
|
Back to top |
|
|
semigeezer Supermod
Joined: 03 Jan 2003 Posts: 1014 Topics: 13 Location: Atlantis
|
Posted: Tue Nov 22, 2005 12:02 pm Post subject: |
|
|
Just as an aside, there are times when not checking subscript ranges can be useful: reading prefixes of control blocks for example.
Array index use is just a storage address calculation: address of structure + (index -1)*length of element
Using that, you can define a simple array of pointers containing OCCURS n TIMES based at address 0 where n is any positive number and access any location in storage by simply manipulating the index. Not good programming practice because it is hard to maintain, but in a quick-and-dirty programming situation, it can be very useful.
Also, note that the logic of the program should avoid out of range conditions. If you need SSRANGE to catch the error, you are adding runtime overhead to everything inorder to catch a design flaw in the program. (Yes, that is a philosophical point, but that is my opinion on it) |
|
Back to top |
|
|
pcmoonbeam Beginner
Joined: 21 Nov 2005 Posts: 31 Topics: 10 Location: Orange County, California
|
Posted: Tue Nov 22, 2005 6:00 pm Post subject: |
|
|
Thank you for your interest. However, my biggest problem is that I'm taking on a position from an individual who didn't test thoroughly, so now I'm having to do damage repair. Having SSRANGE in place on compiles (at least for testing purposes) points directly to the problems that were created. _________________ Thanks,
PCMOONBEAM |
|
Back to top |
|
|
semigeezer Supermod
Joined: 03 Jan 2003 Posts: 1014 Topics: 13 Location: Atlantis
|
Posted: Tue Nov 22, 2005 6:21 pm Post subject: |
|
|
Hmmm I thought all programming was an excersise in damage repair. I know it is when I write code |
|
Back to top |
|
|
edkir98 Beginner
Joined: 27 Aug 2007 Posts: 102 Topics: 42 Location: Chennai
|
Posted: Tue Mar 11, 2008 1:00 am Post subject: |
|
|
I was browsing the forum on SSRANGE and got hold of this topic.
In our system, we dont specify the compiler options. The cobol compiler does not work. We do it thru endevor. If we would want to compile a code then we would add it to ENDEVOR(Version Control Tool). There they have the default compiler options listed and it compiles like that.
I'm able to see from the compiler listing that SSRANGE parameter is set while compiling.
I had used an two dimensional array (Internal Table) and in a particular paragraph, the array index was set as (1,0). This caused memory overlap and hence a wrong value had moved to another variable and hence it caused a S0C7 abend.
Why is that, although SSRANGE parameter was set why dint the program abend when it referenced a invalid starting position? Why dint it do the "range-checking"?
Am I clear with my question? Please advise if there are any additional options that would override this paramer? |
|
Back to top |
|
|
mf_user Intermediate
Joined: 01 Jun 2003 Posts: 372 Topics: 105
|
Posted: Tue Mar 11, 2008 6:45 am Post subject: |
|
|
Hi, semigeezer.
Quote: |
Just as an aside, there are times when not checking subscript ranges can be useful: reading prefixes of control blocks for example.
Array index use is just a storage address calculation: address of structure + (index -1)*length of element
Using that, you can define a simple array of pointers containing OCCURS n TIMES based at address 0 where n is any positive number and access any location in storage by simply manipulating the index. Not good programming practice because it is hard to maintain, but in a quick-and-dirty programming situation, it can be very useful.
Also, note that the logic of the program should avoid out of range conditions. If you need SSRANGE to catch the error, you are adding runtime overhead to everything inorder to catch a design flaw in the program. (Yes, that is a philosophical point, but that is my opinion on it)
|
What do you suggest to avoid tha above?
Please explain it in detail.
TIA. _________________ MF
==
Any training that does not include the emotions, mind and body is incomplete; knowledge fades without feeling.
== |
|
Back to top |
|
|
CraigG Intermediate
Joined: 02 May 2007 Posts: 202 Topics: 0 Location: Viginia, USA
|
Posted: Tue Mar 11, 2008 7:27 am Post subject: |
|
|
SSRANGE also produces extra code in the program, which is why we con't use it for production compiles. |
|
Back to top |
|
|
edkir98 Beginner
Joined: 27 Aug 2007 Posts: 102 Topics: 42 Location: Chennai
|
Posted: Tue Mar 11, 2008 7:50 am Post subject: |
|
|
Craig.. You are correct!! I see NOSSRANGE is defined in the PROD environment. But why is that? _________________ Thanks |
|
Back to top |
|
|
jsharon1248 Intermediate
Joined: 08 Aug 2007 Posts: 291 Topics: 2 Location: Chicago
|
Posted: Tue Mar 11, 2008 8:18 am Post subject: |
|
|
A limited sample to be sure, but the shops I've visited in my career enable SSRANGE for the test environments and then NOSSRANGE for production. The thought being that adequate testing will reveal out of range conditions prior to rolling out the code to production.
edkir
Please be careful when you make a statement like
Quote: | The cobol compiler does not work. We do it thru endevor. |
Endevor is not a compiler. It is a source manager that submits compiles. If SSRANGE is not detecting something that you think should be an out of range index, it's because the effective address is within the table.
To explain the behavior you mentioned, note the comments about the effective address.
Code: | Use SSRANGE to generate code that checks if subscripts (including ALL subscripts) or
indexes try to reference an area outside the region of the table. Each subscript or
index is not individually checked for validity; rather, the effective address is
checked to ensure that it does not cause a reference outside the region of the table.
Variable-length items will also be checked to ensure that the reference is within
their maximum defined length. |
One last comment. The SSRANGE code can be enabled/disabled at run time.
Code: | If SSRANGE is in effect at compile time, the range-checking code is generated. You
can inhibit range checking by specifying CHECK(OFF) as a run-time option. This
leaves range-checking code dormant in the object code. The range-checking code
can then be optionally used to aid in resolving any unexpected errors without
recompilation. |
|
|
Back to top |
|
|
acevedo Beginner
Joined: 03 Dec 2002 Posts: 127 Topics: 0 Location: Europe
|
Posted: Tue Mar 11, 2008 8:45 am Post subject: |
|
|
CraigG wrote: | SSRANGE also produces extra code in the program, which is why we con't use it for production compiles. |
same here. |
|
Back to top |
|
|
|
|