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