Hello, all

Attached is my fix for bug
#585(https://bugs.open64.net/show_bug.cgi?id=585). There are three
test cases attached to the bug report. They all experience same
problem: compile time segmentation fault at wgen phase. However, each
of them is caused by a different problem.

pr22061-2.c
===========
The test case is shown below:

int *x;
static void bar (char a[2][(*x)++]) {}

The problem is that when generating type information for bar function,
(*x)++ needs to be expanded since `a` is a variable length array.
However, current wgen assumes that WHIRL node for current function
(`Current_Entry_Wn()`) already exists. However, this is not true at
the time of generating function type information.

crash2.C
========
The part of code causing problems is shown below:

R1::R1( const R& a ) :
    m_( a.empty() ? get_empty().m_ : C() )

The gspin expression for the select is organized as follows:

COND_EXPR
 |-- COND
 |-- TARGET_EXPR
      |-- COMPONENT_REF (S1)
           |-- INDIRECT_REF
           |-- ...
      |-- COMPONENT_REF (S2)
           |-- TARGET_REF
           |-- ...
 |-- ...

S1 is actually a VAR_DECL expression in gspin file. It is changed to
COMPONENT_REF when converting COND_EXPR (see wgen_expr.cxx:6056, added
for bug 15210). However, the presence of INDIRECT_REF causes target
symbol being NULL and this caused segmentation fault in WN_Lda
function.

ftp.i
=====
The following code snippet caused the problem:

struct string {
    unsigned char *source;
};
struct ftp_file_info {
    struct string name;
    struct string symlink;
    long size;
    time_t mtime;
    unsigned int local_time_zone:1;
    mode_t permissions;
};
static int ftp_process_dirlist()
{
    int ret = 0;
    while (1) {
        struct ftp_file_info ftp_info = { FTP_FILE_UNKNOWN, {"", 0},
{"", 0}, -1, 0, 0 };
    }
}

The compiler tries to generate initialization code for each field of
`ftp_info`. For each field, `Advance_Field_Id` is called to advance to
next field after generating initialization code for current field. Due
to the presence of `struct string`, the field_id and fld is no long in
sync. For example, after generating initialization code for
ftp_info.symlink, the field_id is the for the last field of symlink
struct (ftp_info.symlink.source) while fld still points to
ftp_info.symlink field. This caused field_id being incremented
incorrectly and caused segmentation fault in `FLD_get_to_field`
function.


Thanks.
-------------------------------
Feng Zhou

Attachment: bug585_v1_open64.patch
Description: Binary data

------------------------------------------------------------------------------
Protect Your Site and Customers from Malware Attacks
Learn about various malware tactics and how to avoid them. Understand 
malware threats, the impact they can have on your business, and how you 
can protect your company and customers by using code signing.
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to