aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/analyzer/strstr-1.c
blob: 469e6a817d0d7cd8ebbb55ba380c7c1637b1e4f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/* See e.g. https://en.cppreference.com/w/c/string/byte/strstr  */

/* { dg-additional-options "-fpermissive" { target c++ } } */

#include "../../gcc.dg/analyzer/analyzer-decls.h"

extern char *strstr (const char* str, const char* substr);

char *
test_passthrough (const char* str, const char* substr)
{
  return strstr (str, substr);
}

char *
test_NULL_str (const char *substr)
{
  return strstr (NULL, substr); /* { dg-warning "use of NULL where non-null expected" } */
}

char *
test_unterminated_str (const char *substr)
{
  char str[3] = "abc"; /* { dg-warning "initializer-string for '\[^\n\]*' is too long" "" { target c++ } } */
  return strstr (str, substr); /* { dg-warning "stack-based buffer over-read" } */
  /* { dg-message "while looking for null terminator for argument 1" "note" { target *-*-* } .-1 } */
}

char *
test_uninitialized_str (const char *substr)
{
  char str[16];
  return strstr (str, substr); /* { dg-warning "use of uninitialized value 'str\\\[0\\\]'" } */
}

char *
test_NULL_substr (const char *str)
{
  return strstr (str, NULL); /* { dg-warning "use of NULL where non-null expected" } */
}

char *
test_unterminated_substr (const char *str)
{
  char substr[3] = "abc"; /* { dg-warning "initializer-string for '\[^\n\]*' is too long" "" { target c++ } } */
  return strstr (str, substr); /* { dg-warning "stack-based buffer over-read" } */
  /* { dg-message "while looking for null terminator for argument 2" "note" { target *-*-* } .-1 } */
}

char *test_uninitialized_substr (const char *str)
{
  char substr[16];
  return strstr (str, substr); /* { dg-warning "use of uninitialized value 'substr\\\[0\\\]'" } */
}