dead-stores.c revision 632d1ece2715b1c8a0c99e1b8b487f4c148c89d5
1d427023c334fe03105d9359711a3df4d6f23b344Daniel Dunbar// RUN: clang -analyze -warn-dead-stores -verify %s &&
29457a800f1fea4db4bb595c77de277609913b1b3Ted Kremenek// RUN: clang -analyze -checker-simple -analyzer-store=basic -analyzer-constraints=basic -warn-dead-stores -verify %s &&
39457a800f1fea4db4bb595c77de277609913b1b3Ted Kremenek// RUN: clang -analyze -checker-simple -analyzer-store=basic -analyzer-constraints=range -warn-dead-stores -verify %s &&
49457a800f1fea4db4bb595c77de277609913b1b3Ted Kremenek// RUN: clang -analyze -checker-cfref -analyzer-store=basic -analyzer-constraints=basic -warn-dead-stores -verify %s &&
59457a800f1fea4db4bb595c77de277609913b1b3Ted Kremenek// RUN: clang -analyze -checker-cfref -analyzer-store=basic -analyzer-constraints=range -warn-dead-stores -verify %s &&
69457a800f1fea4db4bb595c77de277609913b1b3Ted Kremenek// RUN: clang -analyze -checker-cfref -analyzer-store=region -analyzer-constraints=basic -warn-dead-stores -verify %s &&
79457a800f1fea4db4bb595c77de277609913b1b3Ted Kremenek// RUN: clang -analyze -checker-cfref -analyzer-store=region -analyzer-constraints=range -warn-dead-stores -verify %s
88aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek
949a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f1() {
10aa395ba050c558b1ebf66c7868165938d98b6a5bTed Kremenek  int k, y;
110fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  int abc=1;
121a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  long idx=abc+3*5; // expected-warning {{never read}}
13aa395ba050c558b1ebf66c7868165938d98b6a5bTed Kremenek}
148aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek
1549a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f2(void *b) {
168aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek char *c = (char*)b; // no-warning
171a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek char *d = b+1; // expected-warning {{never read}}
18a316e7b735b12ce6b34961a9dcfaae34f4b08d29Douglas Gregor printf("%s", c); // expected-warning{{implicitly declaring C library function 'printf' with type 'int (char const *, ...)'}} \
19a316e7b735b12ce6b34961a9dcfaae34f4b08d29Douglas Gregor // expected-note{{please include the header <stdio.h> or explicitly provide a declaration for 'printf'}}
208aefcbfd3c0409c26ca44c123a41edd631eab9bcTed Kremenek}
2174c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek
2249a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f3() {
230fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  int r;
240fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  if ((r = f()) != 0) { // no-warning
250fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek    int y = r; // no-warning
260fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek    printf("the error is: %d\n", y);
270fdf06e5eef80ce56ce6499ba662453919b95af1Ted Kremenek  }
2874c43a0967d07572dd6907776d91cdb2b2e7179aTed Kremenek}
2949a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
3049a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenekvoid f4(int k) {
3149a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
3249a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek  k = 1;
3349a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
3449a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek  if (k)
3549a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek    f1();
3649a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek
371a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  k = 2;  // expected-warning {{never read}}
3849a2fd2758996b6f674babf19c75b3d01e77e2d4Ted Kremenek}
39f87821c086a46411883b385c743996a35cc8e154Ted Kremenek
40f87821c086a46411883b385c743996a35cc8e154Ted Kremenekvoid f5() {
41f87821c086a46411883b385c743996a35cc8e154Ted Kremenek
42f87821c086a46411883b385c743996a35cc8e154Ted Kremenek  int x = 4; // no-warning
431a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  int *p = &x; // expected-warning{{never read}}
44f87821c086a46411883b385c743996a35cc8e154Ted Kremenek
45a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek}
46a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek
47a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenekint f6() {
48a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek
49a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek  int x = 4;
501a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  ++x; // expected-warning{{never read}}
51a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek  return 1;
52a23157e6b9e2388edebd3d383dd7acfab6a4c0c0Ted Kremenek}
531a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek
541a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenekint f7(int *p) {
551a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  // This is allowed for defensive programming.
561a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  p = 0; // no-warning
571a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  return 1;
581a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek}
591a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek
601a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenekint f8(int *p) {
614489fe10fa073eb326e2c8906db170f009050911Daniel Dunbar  extern int *baz();
621a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  if (p = baz()) // expected-warning{{Although the value}}
631a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek    return 1;
641a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek  return 0;
651a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek}
661a654b60ef40e84f3943cdb581795c4d4dae1e45Ted Kremenek
672cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f9() {
682cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  int x = 4;
692cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  x = x + 10; // expected-warning{{never read}}
702cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  return 1;
712cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek}
722cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek
732cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenekint f10() {
742cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  int x = 4;
752cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  x = 10 + x; // expected-warning{{never read}}
762cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek  return 1;
772cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek}
782cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek
798b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenekint f11() {
808b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek  int x = 4;
81380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek  return x++; // expected-warning{{never read}}
828b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek}
838b00b6e80dbeb04dd919699f7818344dd4cbaad9Ted Kremenek
84380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenekint f11b() {
85380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek  int x = 4;
867f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek  return ((((++x)))); // no-warning
87380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek}
88380277e46ec1d2d9abedcddf357ceea935cbe576Ted Kremenek
89fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12a(int y) {
90fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  int x = y;  // expected-warning{{never read}}
91fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  return 1;
92fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek}
93fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenekint f12b(int y) {
94fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  int x __attribute__((unused)) = y;  // no-warning
95fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek  return 1;
96fc7ff5540412f8003024e1b4940fb8408dff2ca6Ted Kremenek}
972cfac226b028e5a2165af077268f70cd2ab4b1a8Ted Kremenek
98efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek// Filed with PR 2630.  This code should produce no warnings.
99efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenekint f13(void)
100efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek{
101efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  int a = 1;
102efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  int b, c = b = a + a;
103efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek
104efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  if (b > 0)
105efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek    return (0);
106efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek
107efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek  return (a + b + c);
108efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek}
109efe88f5776b42ec2defb8ba29269a6c3683e9485Ted Kremenek
110b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek// Filed with PR 2763.
11184fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekint f14(int count) {
112b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  int index, nextLineIndex;
113b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  for (index = 0; index < count; index = nextLineIndex+1) {
114b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek    nextLineIndex = index+1;  // no-warning
115b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek    continue;
116b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  }
117b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek  return index;
118b497ebdce35c708e902db2d49183925a612b4914Ted Kremenek}
11984fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek
12084fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek// Test case for <rdar://problem/6248086>
12184fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenekvoid f15(unsigned x, unsigned y) {
12284fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek  int count = x * y;   // no-warning
12384fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek  int z[count];
12484fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek}
12584fa6b90abf73e8cc539c9947ed5a6286f588569Ted Kremenek
126610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenekint f16(int x) {
127610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek  x = x * 2;
128d2025e26738c3017af6685e342a3a746cdf8249fTed Kremenek  x = sizeof(int [x = (x || x + 1) * 2]) // expected-warning{{Although the value stored to 'x' is used}}
129d2025e26738c3017af6685e342a3a746cdf8249fTed Kremenek      ? 5 : 8;
130610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek  return x;
131610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek}
132610a09e409bea151a42dd907768f1e0c4b103f1fTed Kremenek
1333b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek// Self-assignments should not be flagged as dead stores.
1343b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenekint f17() {
1353b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek  int x = 1;
1363b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek  x = x; // no-warning
1373b58786f85aaa173e122f6eaff0b6efa233d59a2Ted Kremenek}
1387f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek
1397f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// <rdar://problem/6506065>
1407f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// The values of dead stores are only "consumed" in an enclosing expression
1417f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek// what that value is actually used.  In other words, don't say "Although the value stored to 'x' is used...".
1427f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenekint f18() {
1437f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   int x = 0; // no-warning
1447f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   if (1)
1457f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek      x = 10;  // expected-warning{{Value stored to 'x' is never read}}
1467f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   while (1)
1477f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek      x = 10;  // expected-warning{{Value stored to 'x' is never read}}
1487f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   do
1497f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek      x = 10;   // expected-warning{{Value stored to 'x' is never read}}
1507f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek   while (1);
1517f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek
1527f5fce7200fdbf03f7d70134a57271e584fcb766Ted 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'}}
1537f5fce7200fdbf03f7d70134a57271e584fcb766Ted Kremenek}
154d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek
155d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek// PR 3514: false positive `dead initialization` warning for init to global
156d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek//  http://llvm.org/bugs/show_bug.cgi?id=3514
157d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekextern const int MyConstant;
158d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekint f19(void) {
159d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  int x = MyConstant;  // no-warning
160d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  x = 1;
161d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  return x;
162d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek}
163d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek
164d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenekint f19b(void) { // FIXME: Should this case be considered the same as f19?
165d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  const int MyConstant = 0;
166d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  int x = MyConstant; // expected-warning{{never read}}
167d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  x = 1;
168d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek  return x;
169d3098ee64c069a3eff4d2d0a5d655d968c7b5dd2Ted Kremenek}
170632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek
171632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenekvoid f20(void) {
172632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek  int x = 1; // no-warning
173632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek#pragma unused(x)
174632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek}
175632d1ece2715b1c8a0c99e1b8b487f4c148c89d5Ted Kremenek
176