/// <summary>
                /// Join that performs trickery to keep bounds on pointers if one side is null
                /// </summary>
                /// <param name="pc">PC of join point</param>
                public StripeWithIntervalsForUnsafeCode Join(StripeWithIntervalsForUnsafeCode prevState, APC pc)
                {
                    IntervalsForUnsafeCode thisInterval = (IntervalsForUnsafeCode)this.Left.Clone();

                    IntervalsForUnsafeCode prevInterval = (IntervalsForUnsafeCode)prevState.Left.Clone();

                    IntervalsForUnsafeCode joinLeftPart = (IntervalsForUnsafeCode)((IntervalsForUnsafeCode)this.Left).Join(prevState.Left, this.nullPointers.Union(prevState.nullPointers), pc);

                    // Pietro's
                    // if (!light)
                    if (true)
                    {
                        //Before permorming the join, it refines the information contained in the domain
                        StripeForUnsafeCode thisRightRefined = (StripeForUnsafeCode)((StripeForUnsafeCode)this.Right).RefineInternally();
                        StripeForUnsafeCode prevRightRefined = (StripeForUnsafeCode)((StripeForUnsafeCode)prevState.Right).RefineInternally();
                        StripeForUnsafeCode joinRightPart    = (StripeForUnsafeCode)thisRightRefined.Join(prevRightRefined, this.nullPointers.Union(prevState.nullPointers), thisInterval, prevInterval, pc);

                        //It resets the set of the bottom pointers
                        nullPointers = new Set <BoxedExpression>();
                        return((StripeWithIntervalsForUnsafeCode)prevState.Reduce(joinLeftPart, joinRightPart));
                    }
                    //else
                    //{
                    //  StripeForUnsafeCode joinRightPart = (StripeForUnsafeCode)this.Right.Join(prevState.Right, this.nullPointers.Union(prevState.nullPointers));
                    //  nullPointers = new Set<BoxedExpression>();
                    //  return (StripeWithIntervalsForUnsafeCode)prevState.Reduce(joinLeftPart, joinRightPart);
                    //}
                }
                public StripeWithIntervalsForUnsafeCode Widening(StripeWithIntervalsForUnsafeCode prevState, APC pc)
                {
                    IntervalsForUnsafeCode thisInterval = (IntervalsForUnsafeCode)this.Left.Clone();

                    IntervalsForUnsafeCode prevInterval = (IntervalsForUnsafeCode)prevState.Left.Clone();

                    if (this.IsBottom)
                    {
                        return(prevState);
                    }
                    if (prevState.IsBottom)
                    {
                        return(this);
                    }

                    IntervalsForUnsafeCode joinLeftPart = (IntervalsForUnsafeCode)((IntervalsForUnsafeCode)this.Left).Widening(prevState.Left);

                    // Pietro's
                    //if (!light)
                    if (true)
                    {
                        //Since our domain is of finite height, we can use the version of join operator improved with the information abount null pointers
                        StripeForUnsafeCode thisRightRefined = (StripeForUnsafeCode)((StripeForUnsafeCode)this.Right).RefineInternally();
                        StripeForUnsafeCode prevRightRefined = (StripeForUnsafeCode)((StripeForUnsafeCode)prevState.Right).RefineInternally();
                        StripeForUnsafeCode joinRightPart    = (StripeForUnsafeCode)thisRightRefined.Join(prevRightRefined, this.nullPointers.Union(prevState.nullPointers), thisInterval, prevInterval, pc);

                        //It resets the set of the bottom pointers
                        nullPointers = new Set <BoxedExpression>();
                        return((StripeWithIntervalsForUnsafeCode)prevState.Reduce(joinLeftPart, joinRightPart));
                    }
                    //else
                    //{
                    //  StripeForUnsafeCode joinRightPart = (StripeForUnsafeCode)this.Right.Join(prevState.Right, this.nullPointers.Union(prevState.nullPointers));
                    //  nullPointers = new Set<BoxedExpression>();
                    //  return (StripeWithIntervalsForUnsafeCode)prevState.Reduce(joinLeftPart, joinRightPart);
                    //}
                }