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
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