dead-stores.c revision d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2
1d427023c334fe03105d9359711a3df4d6f23b344Daniel Dunbar// RUN: clang -analyze -warn-dead-stores -verify %s && 2d427023c334fe03105d9359711a3df4d6f23b344Daniel Dunbar// RUN: clang -analyze -checker-simple -warn-dead-stores -verify %s && 3d427023c334fe03105d9359711a3df4d6f23b344Daniel Dunbar// RUN: clang -analyze -warn-dead-stores -checker-simple -verify %s 4e81da5080ce0d5f10baf6b34f599101a569bb2e6Ted Kremenek 58aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek 649a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f1() { 7aa395ba050c558b1ebf66c7868165938d98b6a5bTed Kremenek int k, y; 80fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek int abc=1; 91a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek long idx=abc+3*5; // expected-warning {{never read}} 10aa395ba050c558b1ebf66c7868165938d98b6a5bTed Kremenek} 118aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek 1249a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f2(void *b) { 138aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek char *c = (char*)b; // no-warning 141a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek char *d = b+1; // expected-warning {{never read}} 158aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek printf("%s", c); 168aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek} 1774c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek 1849a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f3() { 190fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek int r; 200fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek if ((r = f()) != 0) { // no-warning 210fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek int y = r; // no-warning 220fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek printf("the error is: %d\n", y); 230fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek } 2474c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek} 2549a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek 2649a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f4(int k) { 2749a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek 2849a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek k = 1; 2949a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek 3049a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek if (k) 3149a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek f1(); 3249a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek 331a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek k = 2; // expected-warning {{never read}} 3449a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek} 35f87821c086a46411883b385c743996a35cc8e154Ted Kremenek 36f87821c086a46411883b385c743996a35cc8e154Ted Kremenekvoid f5() { 37f87821c086a46411883b385c743996a35cc8e154Ted Kremenek 38f87821c086a46411883b385c743996a35cc8e154Ted Kremenek int x = 4; // no-warning 391a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek int *p = &x; // expected-warning{{never read}} 40f87821c086a46411883b385c743996a35cc8e154Ted Kremenek 41a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek} 42a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek 43a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenekint f6() { 44a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek 45a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek int x = 4; 461a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek ++x; // expected-warning{{never read}} 47a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek return 1; 48a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek} 491a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek 501a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenekint f7(int *p) { 511a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek // This is allowed for defensive programming. 521a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek p = 0; // no-warning 531a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek return 1; 541a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek} 551a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek 561a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenekint f8(int *p) { 574489fe10fa073eb326e2c8906db170f009050911Daniel Dunbar extern int *baz(); 581a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek if (p = baz()) // expected-warning{{Although the value}} 591a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek return 1; 601a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek return 0; 611a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek} 621a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek 632cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f9() { 642cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek int x = 4; 652cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek x = x + 10; // expected-warning{{never read}} 662cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek return 1; 672cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek} 682cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek 692cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f10() { 702cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek int x = 4; 712cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek x = 10 + x; // expected-warning{{never read}} 722cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek return 1; 732cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek} 742cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek 758b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenekint f11() { 768b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek int x = 4; 77380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek return x++; // expected-warning{{never read}} 788b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek} 798b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek 80380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenekint f11b() { 81380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek int x = 4; 827f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek return ((((++x)))); // no-warning 83380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek} 84380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek 85fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12a(int y) { 86fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek int x = y; // expected-warning{{never read}} 87fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek return 1; 88fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek} 89fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12b(int y) { 90fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek int x __attribute__((unused)) = y; // no-warning 91fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek return 1; 92fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek} 932cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek 94efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek// Filed with PR 2630. This code should produce no warnings. 95efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenekint f13(void) 96efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek{ 97efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek int a = 1; 98efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek int b, c = b = a + a; 99efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek 100efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek if (b > 0) 101efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek return (0); 102efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek 103efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek return (a + b + c); 104efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek} 105efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek 106b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek// Filed with PR 2763. 10784fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekint f14(int count) { 108b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek int index, nextLineIndex; 109b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek for (index = 0; index < count; index = nextLineIndex+1) { 110b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek nextLineIndex = index+1; // no-warning 111b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek continue; 112b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek } 113b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek return index; 114b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek} 11584fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek 11684fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek// Test case for <rdar://problem/6248086> 11784fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekvoid f15(unsigned x, unsigned y) { 11884fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek int count = x * y; // no-warning 11984fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek int z[count]; 12084fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek} 12184fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek 122610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenekint f16(int x) { 123610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek x = x * 2; 124d2025e26738c3017af6685e342a3a746cdf8249fTed Kremenek x = sizeof(int [x = (x || x + 1) * 2]) // expected-warning{{Although the value stored to 'x' is used}} 125d2025e26738c3017af6685e342a3a746cdf8249fTed Kremenek ? 5 : 8; 126610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek return x; 127610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek} 128610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek 1293b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek// Self-assignments should not be flagged as dead stores. 1303b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenekint f17() { 1313b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek int x = 1; 1323b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek x = x; // no-warning 1333b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek} 1347f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek 1357f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// <rdar://problem/6506065> 1367f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// The values of dead stores are only "consumed" in an enclosing expression 1377f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// what that value is actually used. In other words, don't say "Although the value stored to 'x' is used...". 1387f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenekint f18() { 1397f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek int x = 0; // no-warning 1407f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek if (1) 1417f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek x = 10; // expected-warning{{Value stored to 'x' is never read}} 1427f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek while (1) 1437f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek x = 10; // expected-warning{{Value stored to 'x' is never read}} 1447f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek do 1457f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek x = 10; // expected-warning{{Value stored to 'x' is never read}} 1467f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek while (1); 1477f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek 1487f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek return (x = 10); // expected-warning{{Although the value stored to 'x' is used in the enclosing expression, the value is never actually read from 'x'}} 1497f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek} 150d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek 151d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek// PR 3514: false positive `dead initialization` warning for init to global 152d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek// http://llvm.org/bugs/show_bug.cgi?id=3514 153d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekextern const int MyConstant; 154d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekint f19(void) { 155d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek int x = MyConstant; // no-warning 156d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek x = 1; 157d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek return x; 158d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek} 159d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek 160d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekint f19b(void) { // FIXME: Should this case be considered the same as f19? 161d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek const int MyConstant = 0; 162d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek int x = MyConstant; // expected-warning{{never read}} 163d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek x = 1; 164d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek return x; 165d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek} 166