From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10501 invoked by alias); 11 Oct 2005 09:37:38 -0000 Mailing-List: contact gcc-help-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-help-owner@gcc.gnu.org Received: (qmail 10485 invoked by uid 22791); 11 Oct 2005 09:37:35 -0000 Received: from web26908.mail.ukl.yahoo.com (HELO web26908.mail.ukl.yahoo.com) (217.146.176.97) by sourceware.org (qpsmtpd/0.30-dev) with SMTP; Tue, 11 Oct 2005 09:37:35 +0000 Received: (qmail 17211 invoked by uid 60001); 11 Oct 2005 09:37:33 -0000 Message-ID: <20051011093733.17209.qmail@web26908.mail.ukl.yahoo.com> Received: from [195.65.51.100] by web26908.mail.ukl.yahoo.com via HTTP; Tue, 11 Oct 2005 11:37:33 CEST Date: Tue, 11 Oct 2005 09:37:00 -0000 From: nrmj Subject: strict aliasing and pointer to struct To: gcc-help@gcc.gnu.org MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-SW-Source: 2005-10/txt/msg00052.txt.bz2 I have been googling a lot on the web about alias analysis and strict aliasing, but haven't found much about what is allowed or not when working with structures. 1) If I understand the C standard correctly, the compiler is free to assume that two pointers pointing to different types don't alias. If two struct have different tag name, like: struct s1 {int i;}; struct s2 {int i;}; struct s1 *p1; struct s2 *p2; p1 and p2 are considered by the compiler to point to different locations and don't alias, because p1 points to type "struct s1" and p2 points to type "struct s2" which are different types, even if they have the same members, right ? 2) Is it safe to cast pointer to struct B to pointer to struct A, in order to fake inheritance, like in this code sniplet ? ( and if it is not safe, how can I fake inheritance ? ) -------------------- myfile.c ---------------- #include #include typedef enum { RED, BLUE, GREEN } Color; struct Point { int x; int y; }; struct Color_Point { int x; int y; Color color; }; struct Color_Point2{ struct Point point; Color color; }; int main(int argc, char* argv[]) { struct Point* p; struct Color_Point* my_color_point = malloc(sizeof(struct Color_Point)); my_color_point->x = 10; my_color_point->y = 20; my_color_point->color = GREEN; p = (struct Point*)my_color_point; // is it allowed by C standard ? printf("x:%d, y:%d\n", p->x, p->y); struct Color_Point2* my_color_point2 = malloc(sizeof(struct Color_Point2)); my_color_point2->point.x = 100; my_color_point2->point.y = 200; my_color_point2->color = RED; p = (struct Point*)my_color_point2; // is it allowed by C standard ? printf("x:%d, y:%d\n", p->x, p->y); return 0; } Is this example also a case of what is called "type-punning" ? 3) When programming with socket, the following cast to (struct sockaddr *) is very common. But is it really safe ? struct sockaddr_in my_addr; ... bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); Best regards ___________________________________________________________________________ Appel audio GRATUIT partout dans le monde avec le nouveau Yahoo! Messenger Téléchargez cette version sur http://fr.messenger.yahoo.com