1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -Wunused-variable -analyze -analyzer-checker=core,deadcode.DeadStores -fblocks -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -Wunused-variable -analyze -analyzer-checker=core,deadcode.DeadStores -analyzer-store=region -analyzer-constraints=range -fblocks -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s 38aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek 449a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f1() { 5ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek int k, y; // expected-warning{{unused variable 'k'}} expected-warning{{unused variable 'y'}} 60fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek int abc=1; 7ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek long idx=abc+3*5; // expected-warning {{never read}} expected-warning{{unused variable 'idx'}} 8aa395ba050c558b1ebf66c7868165938d98b6a5bTed Kremenek} 98aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek 1049a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f2(void *b) { 118aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek char *c = (char*)b; // no-warning 12ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek char *d = b+1; // expected-warning {{never read}} expected-warning{{unused variable 'd'}} 135faf5d31fa634e1fdb576c4d9708cd4efa5ea310Jean-Daniel Dupas printf("%s", c); // expected-warning{{implicitly declaring library function 'printf' with type 'int (const char *, ...)'}} \ 14a316e7b735b12ce6b34961a9dcfaae34f4b08d29Douglas Gregor // expected-note{{please include the header <stdio.h> or explicitly provide a declaration for 'printf'}} 158aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek} 1674c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek 17e030358cc06e1cbce3c2e00ca67c946f9164b2a8Chris Lattnerint f(); 18e030358cc06e1cbce3c2e00ca67c946f9164b2a8Chris Lattner 1949a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f3() { 200fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek int r; 210fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek if ((r = f()) != 0) { // no-warning 220fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek int y = r; // no-warning 230fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek printf("the error is: %d\n", y); 240fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek } 2574c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek} 2649a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek 2749a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f4(int k) { 2849a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek 2949a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek k = 1; 3049a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek 3149a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek if (k) 3249a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek f1(); 3349a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek 341a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek k = 2; // expected-warning {{never read}} 3549a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek} 3693fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek 37f87821c086a46411883b385c743996a35cc8e154Ted Kremenekvoid f5() { 38f87821c086a46411883b385c743996a35cc8e154Ted Kremenek 39f87821c086a46411883b385c743996a35cc8e154Ted Kremenek int x = 4; // no-warning 40ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek int *p = &x; // expected-warning{{never read}} expected-warning{{unused variable 'p'}} 41f87821c086a46411883b385c743996a35cc8e154Ted Kremenek 42a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek} 43a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek 44f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek// 45a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenekint f6() { 46a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek 47a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek int x = 4; 48f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek ++x; // no-warning 49a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek return 1; 50a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek} 511a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek 521a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenekint f7(int *p) { 531a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek // This is allowed for defensive programming. 541a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek p = 0; // no-warning 551a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek return 1; 561a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek} 571a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek 5893fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenekint f7b(int *p) { 5993fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek // This is allowed for defensive programming. 6093fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek p = (0); // no-warning 6193fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek return 1; 6293fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek} 6393fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek 6493fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenekint f7c(int *p) { 6593fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek // This is allowed for defensive programming. 6693fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek p = (void*) 0; // no-warning 6793fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek return 1; 6893fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek} 6993fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek 7093fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenekint f7d(int *p) { 7193fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek // This is allowed for defensive programming. 7293fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek p = (void*) (0); // no-warning 7393fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek return 1; 7493fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek} 7593fab7c94008d9e2b1e4ce15784544c6710945feTed Kremenek 7656b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek// Don't warn for dead stores in nested expressions. We have yet 7756b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek// to see a real bug in this scenario. 781a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenekint f8(int *p) { 794489fe10fa073eb326e2c8906db170f009050911Daniel Dunbar extern int *baz(); 8056b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek if ((p = baz())) // no-warning 811a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek return 1; 821a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek return 0; 831a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek} 841a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek 852cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f9() { 862cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek int x = 4; 872cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek x = x + 10; // expected-warning{{never read}} 882cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek return 1; 892cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek} 902cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek 912cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f10() { 922cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek int x = 4; 932cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek x = 10 + x; // expected-warning{{never read}} 942cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek return 1; 952cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek} 962cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek 978b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenekint f11() { 988b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek int x = 4; 99380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek return x++; // expected-warning{{never read}} 1008b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek} 1018b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek 102380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenekint f11b() { 103380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek int x = 4; 1047f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek return ((((++x)))); // no-warning 105380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek} 106380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek 107fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12a(int y) { 108ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek int x = y; // expected-warning{{unused variable 'x'}} 109fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek return 1; 110fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek} 111fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12b(int y) { 112fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek int x __attribute__((unused)) = y; // no-warning 113fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek return 1; 114fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek} 115ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenekint f12c(int y) { 116ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek // Allow initialiation of scalar variables by parameters as a form of 117ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek // defensive programming. 118ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek int x = y; // no-warning 119ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek x = 1; 120ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek return x; 121ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek} 1222cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek 123efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek// Filed with PR 2630. This code should produce no warnings. 124efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenekint f13(void) 125efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek{ 126efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek int a = 1; 127efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek int b, c = b = a + a; 128efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek 129efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek if (b > 0) 130efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek return (0); 131efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek 132efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek return (a + b + c); 133efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek} 134efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek 135b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek// Filed with PR 2763. 13684fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekint f14(int count) { 137b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek int index, nextLineIndex; 138b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek for (index = 0; index < count; index = nextLineIndex+1) { 139b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek nextLineIndex = index+1; // no-warning 140b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek continue; 141b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek } 142b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek return index; 143b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek} 14484fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek 14584fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek// Test case for <rdar://problem/6248086> 14684fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekvoid f15(unsigned x, unsigned y) { 14784fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek int count = x * y; // no-warning 148ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek int z[count]; // expected-warning{{unused variable 'z'}} 14984fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek} 15084fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek 15156b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek// Don't warn for dead stores in nested expressions. We have yet 15256b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek// to see a real bug in this scenario. 153610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenekint f16(int x) { 154610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek x = x * 2; 155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines x = sizeof(int [x = (x || x + 1) * 2]) 156d2025e26738c3017af6685e342a3a746cdf8249fTed Kremenek ? 5 : 8; 157610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek return x; 158610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek} 159610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek 1603b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek// Self-assignments should not be flagged as dead stores. 161a5495eadc816b29954e22df55aa9a9d6bb41429cMike Stumpvoid f17() { 1623b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek int x = 1; 163ef52bcb606c73950139a775af61495f63fbc3603Tom Care x = x; 1643b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek} 1657f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek 1667f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// <rdar://problem/6506065> 1677f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// The values of dead stores are only "consumed" in an enclosing expression 168cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump// what that value is actually used. In other words, don't say "Although the 169cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump// value stored to 'x' is used...". 1707f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenekint f18() { 1717f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek int x = 0; // no-warning 1727f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek if (1) 1737f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek x = 10; // expected-warning{{Value stored to 'x' is never read}} 1747f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek while (1) 1757f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek x = 10; // expected-warning{{Value stored to 'x' is never read}} 176848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek // unreachable. 1777f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek do 178848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek x = 10; // no-warning 1797f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek while (1); 180848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek return (x = 10); // no-warning 181848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek} 1827f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek 183848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekint f18_a() { 184848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek int x = 0; // no-warning 18556b1f71156db11b9c8234ca621c29213a73218e0Ted Kremenek return (x = 10); // no-warning 1867f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek} 187d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek 188848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid f18_b() { 189848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek int x = 0; // no-warning 190848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek if (1) 191848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek x = 10; // expected-warning{{Value stored to 'x' is never read}} 192848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek} 193848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek 194848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid f18_c() { 195848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek int x = 0; 196848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek while (1) 197848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek x = 10; // expected-warning{{Value stored to 'x' is never read}} 198848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek} 199848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek 200848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid f18_d() { 201848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek int x = 0; // no-warning 202848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek do 203848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek x = 10; // expected-warning{{Value stored to 'x' is never read}} 204848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek while (1); 205848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek} 206848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek 207d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek// PR 3514: false positive `dead initialization` warning for init to global 208d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek// http://llvm.org/bugs/show_bug.cgi?id=3514 209d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekextern const int MyConstant; 210d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekint f19(void) { 211d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek int x = MyConstant; // no-warning 212d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek x = 1; 213d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek return x; 214d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek} 215d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek 21628433ff063fe5ba5eac486d4bfcfa9e210097772Ted Kremenekint f19b(void) { // This case is the same as f19. 217d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek const int MyConstant = 0; 21828433ff063fe5ba5eac486d4bfcfa9e210097772Ted Kremenek int x = MyConstant; // no-warning 219d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek x = 1; 220d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek return x; 221d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek} 222632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek 223632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenekvoid f20(void) { 224632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek int x = 1; // no-warning 225632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek#pragma unused(x) 226632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek} 227632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek 228cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stumpvoid halt() __attribute__((noreturn)); 229cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stumpint f21() { 230cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump int x = 4; 231cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump 232f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek x = x + 1; // expected-warning{{never read}} 233cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump if (1) { 234cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump halt(); 235cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump (void)x; 236cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump } 237cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump return 1; 238cd7bf230a77c550115e4a78ee371fc49a7563692Mike Stump} 239e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump 240e5af3ce53ec58995b09381ba645ab2117a46647bMike Stumpint j; 241e5af3ce53ec58995b09381ba645ab2117a46647bMike Stumpvoid f22() { 242e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int x = 4; 243e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y1 = 4; 244e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y2 = 4; 245e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y3 = 4; 246e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y4 = 4; 247e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y5 = 4; 248e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y6 = 4; 249e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y7 = 4; 250e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y8 = 4; 251e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y9 = 4; 252e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump int y10 = 4; 2535f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump int y11 = 4; 2545f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump int y12 = 4; 255fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump int y13 = 4; 256fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump int y14 = 4; 257fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump int y15 = 4; 2588f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump int y16 = 4; 2598f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump int y17 = 4; 2608f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump int y18 = 4; 26122cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump int y19 = 4; 26222cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump int y20 = 4; 263e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump 264f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek x = x + 1; // expected-warning{{never read}} 265e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y1; 266e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y2; 267e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y3; 268e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y4; 269e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y5; 270e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y6; 271e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y7; 272e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y8; 273e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y9; 274e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump ++y10; 2755f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump ++y11; 2765f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump ++y12; 277fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump ++y13; 278fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump ++y14; 279fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump ++y15; 2808f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump ++y16; 2818f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump ++y17; 2828f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump ++y18; 28322cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump ++y19; 28422cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump ++y20; 285e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump 286e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump switch (j) { 287e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump case 1: 288e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump if (0) 289e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 290e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump if (1) { 291e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)y1; 292e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump return; 293e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump } 294e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 295e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump break; 296e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump case 2: 297e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump if (0) 298e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 299e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump else { 300e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)y2; 301e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump return; 302e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump } 303e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 304e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump break; 305e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump case 3: 306e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump if (1) { 307e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)y3; 308e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump return; 309e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump } else 310e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 311e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 312e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump break; 313e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump case 4: 314e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump 0 ? : ((void)y4, ({ return; })); 315e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 316e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump break; 317e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump case 5: 318e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump 1 ? : (void)x; 319e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump 0 ? (void)x : ((void)y5, ({ return; })); 320e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 321e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump break; 322e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump case 6: 323e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump 1 ? ((void)y6, ({ return; })) : (void)x; 324e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 325e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump break; 326e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump case 7: 327e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)(0 && x); 328e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)y7; 3291b2ad2fd9e2d5352144481aa1fd995d333d9adc9Argyrios Kyrtzidis (void)(0 || (y8, ({ return; }), 1)); // expected-warning {{expression result unused}} 330e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 331e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump break; 332e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump case 8: 3331b2ad2fd9e2d5352144481aa1fd995d333d9adc9Argyrios Kyrtzidis (void)(1 && (y9, ({ return; }), 1)); // expected-warning {{expression result unused}} 334e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)x; 335e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump break; 336e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump case 9: 337e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)(1 || x); 338e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump (void)y10; 3395f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump break; 3405f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump case 10: 3418f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump while (0) { 3428f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)x; 3435f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump } 3448f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)y11; 3455f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump break; 3465f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump case 11: 3478f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump while (1) { 3488f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)y12; 3495f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump } 3508f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)x; 3515f20363dc8ea094b3f6139f52084beb10d6fcd85Mike Stump break; 352fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump case 12: 3538f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump do { 354fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump (void)y13; 3558f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump } while (0); 3568f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)y14; 3578f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump break; 3588f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump case 13: 3598f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump do { 3608f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)y15; 3618f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump } while (1); 3628f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)x; 3638f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump break; 3648f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump case 14: 3658f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump for (;;) { 3668f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)y16; 367fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump } 368fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump (void)x; 369fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump break; 3708f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump case 15: 371fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump for (;1;) { 3728f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)y17; 373fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump } 374fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump (void)x; 375fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump break; 3768f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump case 16: 377fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump for (;0;) { 378fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump (void)x; 379fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump } 3808f9893a2beeacd5149bd2d3d4c6e130516915068Mike Stump (void)y18; 381fefb9f7009702befaf715e7a8debc9505c3c8634Mike Stump break; 38222cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump case 17: 38322cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump __builtin_choose_expr(0, (void)x, ((void)y19, ({ return; }))); 38422cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump (void)x; 38522cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump break; 38622cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump case 19: 38722cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump __builtin_choose_expr(1, ((void)y20, ({ return; })), (void)x); 38822cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump (void)x; 38922cd6581188bbbc6bedaca64ab171b1187a1c06aMike Stump break; 390e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump } 391e5af3ce53ec58995b09381ba645ab2117a46647bMike Stump} 3923a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek 3933a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenekvoid f23_aux(const char* s); 3943a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenekvoid f23(int argc, char **argv) { 3953a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek int shouldLog = (argc > 1); // no-warning 3963a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek ^{ 3973a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek if (shouldLog) f23_aux("I did too use it!\n"); 3983a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek else f23_aux("I shouldn't log. Wait.. d'oh!\n"); 3993a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek }(); 4003a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek} 4013a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek 4023a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenekvoid f23_pos(int argc, char **argv) { 403ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek int shouldLog = (argc > 1); // expected-warning{{Value stored to 'shouldLog' during its initialization is never read}} expected-warning{{unused variable 'shouldLog'}} 4043a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek ^{ 4053a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek f23_aux("I did too use it!\n"); 4063a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek }(); 4073a9763491c41fe140a8777e0a71e046c56c9cbdbTed Kremenek} 4089a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek 4099a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekvoid f24_A(int y) { 4109a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek // FIXME: One day this should be reported as dead since 'z = x + y' is dead. 4119a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek int x = (y > 2); // no-warning 4129a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek ^ { 413ebd42f40803396d63bc59b77285d088cca61f53fTed Kremenek int z = x + y; // expected-warning{{Value stored to 'z' during its initialization is never read}} expected-warning{{unused variable 'z'}} 4149a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek }(); 4159a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek} 4169a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek 4179a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekvoid f24_B(int y) { 4189a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek // FIXME: One day this should be reported as dead since 'x' is just overwritten. 4199a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek __block int x = (y > 2); // no-warning 4209a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek ^{ 4219a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek // FIXME: This should eventually be a dead store since it is never read either. 4229a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek x = 5; // no-warning 4239a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek }(); 4249a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek} 4259a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek 4269a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekint f24_C(int y) { 4279a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek // FIXME: One day this should be reported as dead since 'x' is just overwritten. 4289a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek __block int x = (y > 2); // no-warning 4299a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek ^{ 4309a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek x = 5; // no-warning 4319a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek }(); 4329a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek return x; 4339a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek} 4349a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek 4359a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenekint f24_D(int y) { 4369a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek __block int x = (y > 2); // no-warning 4379a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek ^{ 4389a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek if (y > 4) 4399a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek x = 5; // no-warning 4409a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek }(); 4419a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek return x; 4429a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek} 4439a0459c0f59a09ac7287ca1f49083fc6b31e4142Ted Kremenek 44474635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek// This example shows that writing to a variable captured by a block means that it might 44574635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek// not be dead. 44674635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenekint f25(int y) { 44774635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek __block int x = (y > 2); 44874635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek __block int z = 0; 44974635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek void (^foo)() = ^{ z = x + y; }; 45074635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek x = 4; // no-warning 45174635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek foo(); 45274635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek return z; 45374635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek} 45474635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek 45574635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek// This test is mostly the same as 'f25', but shows that the heuristic of pruning out dead 45674635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek// stores for variables that are just marked '__block' is overly conservative. 45774635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenekint f25_b(int y) { 45874635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek // FIXME: we should eventually report a dead store here. 45974635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek __block int x = (y > 2); 46074635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek __block int z = 0; 46174635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek x = 4; // no-warning 46274635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek return z; 46374635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek} 46474635d8cd3c367890735dc4af2c2825a7e4b434cTed Kremenek 4652cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenekint f26_nestedblocks() { 4662cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek int z; 4672cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek z = 1; 4682cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek __block int y = 0; 4692cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek ^{ 4702cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek int k; 4712cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek k = 1; // expected-warning{{Value stored to 'k' is never read}} 4722cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek ^{ 4732cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek y = z + 1; 4742cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek }(); 4752cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek }(); 4762cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek return y; 4772cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek} 4782cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek 4793f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek// The FOREACH macro in QT uses 'break' statements within statement expressions 4803f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek// placed within the increment code of for loops. 4813f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenekvoid rdar8014335() { 4823f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek for (int i = 0 ; i != 10 ; ({ break; })) { 483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for ( ; ; ({ ++i; break; })) ; // expected-warning {{'break' is bound to current loop, GCC binds it to the enclosing loop}} 4843f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek // Note that the next value stored to 'i' is never executed 4853f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek // because the next statement to be executed is the 'break' 4863f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek // in the increment code of the first loop. 487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines i = i * 3; // expected-warning{{Value stored to 'i' is never read}} 4883f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek } 4893f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek} 4903f64a0e3be2c9408f8256bd3aa9f0ce9e268982cTed Kremenek 491334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek// <rdar://problem/8320674> NullStmts followed by do...while() can lead to disconnected CFG 492334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek// 493334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek// This previously caused bogus dead-stores warnings because the body of the first do...while was 494334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek// disconnected from the entry of the function. 495334c19566104d3333cf662f0017088a18eddfa81Ted Kremenektypedef struct { float r; float i; } s_rdar8320674; 496334c19566104d3333cf662f0017088a18eddfa81Ted Kremenektypedef struct { s_rdar8320674 x[1]; } s2_rdar8320674; 497334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek 498334c19566104d3333cf662f0017088a18eddfa81Ted Kremenekvoid rdar8320674(s_rdar8320674 *z, unsigned y, s2_rdar8320674 *st, int m) 499334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek{ 500334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek s_rdar8320674 * z2; 501334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek s_rdar8320674 * tw1 = st->x; 502334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek s_rdar8320674 t; 503334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek z2 = z + m; 504334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek do{ 505334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek ; ; 506334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek do{ (t).r = (*z2).r*(*tw1).r - (*z2).i*(*tw1).i; (t).i = (*z2).r*(*tw1).i + (*z2).i*(*tw1).r; }while(0); 507334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek tw1 += y; 508334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek do { (*z2).r=(*z).r-(t).r; (*z2).i=(*z).i-(t).i; }while(0); 509334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek do { (*z).r += (t).r; (*z).i += (t).i; }while(0); 510334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek ++z2; 511334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek ++z; 512334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek }while (--m); 513334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek} 514334c19566104d3333cf662f0017088a18eddfa81Ted Kremenek 515848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek// Avoid dead stores resulting from an assignment (and use) being unreachable. 516848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid rdar8405222_aux(int i); 517848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenekvoid rdar8405222() { 518848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek const int show = 0; 519848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek int i = 0; 520848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek 521848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek if (show) 522848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek i = 5; // no-warning 523848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek 524848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek if (show) 525848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek rdar8405222_aux(i); 526848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek} 527848ec83483ca4ba52ed72c7e29ebc330f8c87252Ted Kremenek 528bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek// Look through chains of assignements, e.g.: int x = y = 0, when employing 529bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek// silencing heuristics. 530bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenekint radar11185138_foo() { 531bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek int x, y; 532bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek x = y = 0; // expected-warning {{never read}} 533bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek return y; 534bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek} 535bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek 536bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenekint rdar11185138_bar() { 537bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek int y; 538bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek int x = y = 0; // no-warning 539bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek x = 2; 540bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek y = 2; 541bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek return x + y; 542bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek} 543bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek 544bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenekint *radar11185138_baz() { 545bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek int *x, *y; 546bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek x = y = 0; // no-warning 547bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek return y; 548bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek} 549bb811cab1bfa91074f1992b154fcb0c288e6eda3Ted Kremenek 5509ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaksint getInt(); 5519ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaksint *getPtr(); 5529ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaksvoid testBOComma() { 5539ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int x0 = (getInt(), 0); // expected-warning{{unused variable 'x0'}} 5549ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int x1 = (getInt(), getInt()); // expected-warning {{Value stored to 'x1' during its initialization is never read}} // expected-warning{{unused variable 'x1'}} 5559ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int x2 = (getInt(), getInt(), getInt()); //expected-warning{{Value stored to 'x2' during its initialization is never read}} // expected-warning{{unused variable 'x2'}} 5569ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int x3; 5579ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks x3 = (getInt(), getInt(), 0); // expected-warning{{Value stored to 'x3' is never read}} 5589ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int x4 = (getInt(), (getInt(), 0)); // expected-warning{{unused variable 'x4'}} 5599ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int y; 5609ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int x5 = (getInt(), (y = 0)); // expected-warning{{unused variable 'x5'}} 5619ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int x6 = (getInt(), (y = getInt())); //expected-warning {{Value stored to 'x6' during its initialization is never read}} // expected-warning{{unused variable 'x6'}} 5629ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int x7 = 0, x8 = getInt(); //expected-warning {{Value stored to 'x8' during its initialization is never read}} // expected-warning{{unused variable 'x8'}} // expected-warning{{unused variable 'x7'}} 5639ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int x9 = getInt(), x10 = 0; //expected-warning {{Value stored to 'x9' during its initialization is never read}} // expected-warning{{unused variable 'x9'}} // expected-warning{{unused variable 'x10'}} 5649ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int m = getInt(), mm, mmm; //expected-warning {{Value stored to 'm' during its initialization is never read}} // expected-warning{{unused variable 'm'}} // expected-warning{{unused variable 'mm'}} // expected-warning{{unused variable 'mmm'}} 5659ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int n, nn = getInt(); //expected-warning {{Value stored to 'nn' during its initialization is never read}} // expected-warning{{unused variable 'n'}} // expected-warning{{unused variable 'nn'}} 5669ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks 5679ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks int *p; 5689ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks p = (getPtr(), (int *)0); // no warning 5699ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks 5709ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks} 5719ed6d8068f767819951bc4eebf6f4912087c442aAnna Zaks 572