This patch looks fine to me. Please commit it. Thank you very much.
2011/1/21 Feng Zhou <[email protected]>
> 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
>
>
> ------------------------------------------------------------------------------
> 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
>
--
Regards,
Lai Jian-Xin
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires
February 28th, so secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Open64-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/open64-devel