Argh! Paul OKed the patch already.
Here are my comments anyway.
On 15/09/2012 11:46, Tobias Burnus wrote:
> Dear all,
>
> this patch fixes some of the warning showing up for gcc/fortran at
> http://scan.coverity.com/. Coverity sells static C/C++/C#/Java code
> analyzers and offer scanning to open-source projects. The result looks
> like
> http://www.coverity.com/images/products/static-analysis/screenshot-1-large.png
>
>
> * [Out of bounds] array.c's gfc_match_array_ref: I am not sure whether
> that code is unreachable, but in any case it is out of bounds. It does
> not seem to trigger for our test cases; maybe removing it and adding an
> assert is sufficient?
>
> diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
> index 44ec72e..1611c3b 100644
> --- a/gcc/fortran/array.c
> +++ b/gcc/fortran/array.c
> @@ -253,7 +253,7 @@ coarray:
> gfc_error ("Invalid form of coarray reference at %C");
> return MATCH_ERROR;
> }
> - else if (ar->dimen_type[ar->codimen + ar->dimen] == DIMEN_STAR)
> + else if (ar->dimen_type[ar->codimen + ar->dimen - 1] == DIMEN_STAR)
> {
> gfc_error ("Unexpected '*' for codimension %d of %d at %C",
> ar->codimen + 1, corank);
That one is not completely obvious.
Your change is bogus in the case ar->dimen==ar->codimen==0 at least.
The loop starts with ar->codimen = 0, and when the closing bracked is
matched, there is an extra ar->codimen++.
So in the scope of the loop, ar->codimen is the maximal coarray index,
not the codimension. I have a feeling that there is no out of bound
here. Does coverity give more details?
>
> * [Uninitialized memory] trans-io.c's gfc_trans_transfer: Here, the
> warning is about accessing uninitialized loop elements in
> gfc_cleanup_loop. The reason is that those aren't initialized for
> expr->rank == 0; I thought that the code should be unreachable due to
> the (se.ss != 0) condition, but an assert fails for instance for
> graphite/pr36286.f90. On the other hand, for se.ss != NULL && expr->rank
> == 0, handling lower code part is wrong as it only deals with "loop".
> Probably, one needs to use "if (se.ss == NULL || expr->rank == 0)",
> which I now did.
> diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c
> index 34db6fd..4ad961f 100644
> --- a/gcc/fortran/trans-io.c
> +++ b/gcc/fortran/trans-io.c
> @@ -2310,7 +2313,7 @@ gfc_trans_transfer (gfc_code * code)
> gfc_add_block_to_block (&body, &se.pre);
> gfc_add_block_to_block (&body, &se.post);
>
> - if (se.ss == NULL)
> + if (se.ss == NULL || expr->rank == 0)
> tmp = gfc_finish_block (&body);
> else
> {
I'm not sure about that one.
I tried adding a `gcc_assert (expr->rank != 0);' in the `else' branch
and it passed for me on pr36286.f90 (but I don't have graphite enabled).
All the other changes look good to me (OK for them).
>
> TODO:
>
> There are also real issues like the following in symbol.c's
> gfc_undo_symbols:
>
> gfc_free_namelist (old->namelist_tail);
> old->namelist_tail->next = NULL;
>
> where one first frees the memory and then sets a component to NULL.
> Locally, I was wondering whether the two lines should be swapped as
> free_namelist also frees ns->next. Alternatively, the "->next" part is
> wrong, which is more in line with the next line of code:
> p->namelist_tail = old->namelist_tail;
> But I think one needs to study the code more closely to know what the
> code is supposed to do.
>
According to the code in match.c, `namelist_tail' seems to be the last
element in the chain so that new elements can be added to
`namelist_tail->next'.
Then `gfc_undo_symbol' should probably have:
gfc_free_namelist (old->namelist_tail->next);
old->namelist_tail->next = NULL;
Thanks
Mikael