Opened 10 years ago
Closed 8 years ago
#2438 closed defect (fixed)
Vect_get_line_type cannot handle line out of range
| Reported by: | artegion | Owned by: | |
|---|---|---|---|
| Priority: | normal | Milestone: | 7.0.5 |
| Component: | LibVector | Version: | unspecified |
| Keywords: | Cc: | ||
| CPU: | Unspecified | Platform: | Unspecified |
Description
calling Vect_get_line_type with line out of range (i.e. line=0) Vect_line_alive returns -1 but Vect_get_line_type ignores it (not -1 is False just like not 1) -> access violation reading ....
>>> from grass.lib.vector import Vect_line_alive
>>> from grass.lib.vector import Vect_get_line_type
>>> from grass.pygrass vector import VectorTopo
>>> a= VectorTopo('test')
>>> a.open()
>>> Vect_line_alive(a.c_mapinfo, 1)
1
>>> Vect_get_line_type(a.c_mapinfo, 1)
1
>>> Vect_line_alive(a.c_mapinfo, 0)
-1
>>> not Vect_line_alive(a.c_mapinfo, 0)
False
>>> Vect_get_line_type(a.c_mapinfo, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
WindowsError: exception: access violation reading 0x736C0014
>>>
Change History (6)
follow-up: 2 comment:1 by , 10 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
follow-ups: 3 4 comment:2 by , 10 years ago
| Resolution: | invalid |
|---|---|
| Status: | closed → reopened |
Replying to mmetz:
Replying to artegion:
calling Vect_get_line_type with line out of range (i.e. line=0) Vect_line_alive returns -1 but Vect_get_line_type ignores it (not -1 is False just like not 1) -> access violation reading ....
This is a programmer's error. 'Vect_get_line_type()' assumes that the programmer first tested if the provided line id is indeed valid. You did call 'Vect_line_alive()' first, you can only proceed if the line is alive. Fix your code.
For sure calling 'Vect_get_line_type()' with a wrong line id is a programmer error but 'Vect_get_line_type()' already call 'Vect_line_alive()'.
258 int Vect_get_line_type(const struct Map_info *Map, int line)
259 {
260 check_level(Map);
261
262 if (!Vect_line_alive(Map, line))
263 return 0;
264
265 return (Map->plus.Line[line]->type);
266 }
Testing if (!Vect_line_alive(Map, line)) is wrong because Vect_line_alive returns
1 feature alive
0 feature is dead
-1 on error
a small change ( if (Vect_line_alive(Map, line!=1)) may improve code robustness.
comment:4 by , 10 years ago
| Milestone: | 6.4.5 → 7.0.0 |
|---|
Replying to artegion:
Replying to mmetz:
Replying to artegion:
calling Vect_get_line_type with line out of range (i.e. line=0) Vect_line_alive returns -1 but Vect_get_line_type ignores it (not -1 is False just like not 1) -> access violation reading ....
This is a programmer's error. 'Vect_get_line_type()' assumes that the programmer first tested if the provided line id is indeed valid. You did call 'Vect_line_alive()' first, you can only proceed if the line is alive. Fix your code.
For sure calling 'Vect_get_line_type()' with a wrong line id is a programmer error but 'Vect_get_line_type()' already call 'Vect_line_alive()'.
Testing if (!Vect_line_alive(Map, line)) is wrong because Vect_line_alive returns
1 feature alive
0 feature is dead
-1 on error
a small change ( if (Vect_line_alive(Map, line!=1)) may improve code robustness.
The problem comes from r55582 which introduced return -1 on error for the Vect_*_alive functions. Unfortunately, the existing calls to Vect_*_alive() were not adjusted. I have restored the behaviour of the Vect_*_alive() functions in r62370,1, no more need to change Vect_get_line_type(). Note that this applies only to G7, not to G6.
comment:5 by , 8 years ago
| Milestone: | 7.0.0 → 7.0.5 |
|---|
comment:6 by , 8 years ago
| Resolution: | → fixed |
|---|---|
| Status: | reopened → closed |

Replying to artegion:
This is a programmer's error. 'Vect_get_line_type()' assumes that the programmer first tested if the provided line id is indeed valid. You did call 'Vect_line_alive()' first, you can only proceed if the line is alive. Fix your code.