⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 builtin-stringop-chk-1.c

📁 用于进行gcc测试
💻 C
字号:
/* Test whether buffer overflow warnings for __*_chk builtins   are emitted properly.  *//* { dg-do compile } *//* { dg-options "-O2 -std=gnu99" } *//* { dg-options "-mstructure-size-boundary=8 -O2 -std=gnu99" { target arm-*-* } } */extern void abort (void);#include "../gcc.c-torture/execute/builtins/chk.h"#include <stdarg.h>volatile void *vx;char buf1[20];int x;voidtest (int arg, ...){  char buf2[20];  va_list ap;  char *p = &buf1[10], *q;  memcpy (&buf2[19], "ab", 1);  memcpy (&buf2[19], "ab", 2); /* { dg-warning "will always overflow" "memcpy" } */  vx = mempcpy (&buf2[19], "ab", 1);  vx = mempcpy (&buf2[19], "ab", 2); /* { dg-warning "will always overflow" "mempcpy" } */  memmove (&buf2[18], &buf1[10], 2);  memmove (&buf2[18], &buf1[10], 3); /* { dg-warning "will always overflow" "memmove" } */  memset (&buf2[16], 'a', 4);  memset (&buf2[15], 'b', 6); /* { dg-warning "will always overflow" "memset" } */  strcpy (&buf2[18], "a");  strcpy (&buf2[18], "ab"); /* { dg-warning "will always overflow" "strcpy" } */  vx = stpcpy (&buf2[18], "a");  vx = stpcpy (&buf2[18], "ab"); /* { dg-warning "will always overflow" "stpcpy" } */  strncpy (&buf2[18], "a", 2);  strncpy (&buf2[18], "a", 3); /* { dg-warning "will always overflow" "strncpy" } */  strncpy (&buf2[18], "abc", 2);  strncpy (&buf2[18], "abc", 3); /* { dg-warning "will always overflow" "strncpy" } */  memset (buf2, '\0', sizeof (buf2));  strcat (&buf2[18], "a");  memset (buf2, '\0', sizeof (buf2));  strcat (&buf2[18], "ab"); /* { dg-warning "will always overflow" "strcat" } */  sprintf (&buf2[18], "%s", buf1);  sprintf (&buf2[18], "%s", "a");  sprintf (&buf2[18], "%s", "ab"); /* { dg-warning "will always overflow" "sprintf" } */  sprintf (&buf2[18], "a");  sprintf (&buf2[18], "ab"); /* { dg-warning "will always overflow" "sprintf" } */  snprintf (&buf2[18], 2, "%d", x);  /* N argument to snprintf is the size of the buffer.     Although this particular call wouldn't overflow buf2,     incorrect buffer size was passed to it and therefore     we want a warning and runtime failure.  */  snprintf (&buf2[18], 3, "%d", x); /* { dg-warning "will always overflow" "snprintf" } */  va_start (ap, arg);  vsprintf (&buf2[18], "a", ap);  va_end (ap);  va_start (ap, arg);  vsprintf (&buf2[18], "ab", ap); /* { dg-warning "will always overflow" "vsprintf" } */  va_end (ap);  va_start (ap, arg);  vsnprintf (&buf2[18], 2, "%s", ap);  va_end (ap);  va_start (ap, arg);  /* See snprintf above.  */  vsnprintf (&buf2[18], 3, "%s", ap); /* { dg-warning "will always overflow" "vsnprintf" } */  va_end (ap);  p = p + 10;  memset (p, 'd', 0);  q = strcpy (p, ""); /* { dg-warning "will always overflow" "strcpy" } */  /* This invokes undefined behaviour, since we are past the end of buf1.  */  p = p + 10;  memset (p, 'd', 1); /* { dg-warning "will always overflow" "memset" } */  memset (q, 'd', 0);  memset (q, 'd', 1); /* { dg-warning "will always overflow" "memset" } */  q = q - 10;  memset (q, 'd', 10);}char *str = "ABCDEFG";typedef struct { char b[16]; } H;/* Some brown paper bag bugs found in real applications.   This test is here merely for amusement.  */voidtest2 (const H h){  char c;  strncpy (&c, str, 3); /* { dg-warning "will always overflow" "strncpy" } */  struct { char b[4]; } x;  sprintf (x.b, "%s", "ABCD"); /* { dg-warning "will always overflow" "sprintf" } */  unsigned int i;  memcpy (&i, &h, sizeof (h)); /* { dg-warning "will always overflow" "memcpy" } */  unsigned char buf[21];  memset (buf + 16, 0, 8); /* { dg-warning "will always overflow" "memset" } */  typedef struct { int i, j, k, l; } S;  S *s[3];  memset (s, 0, sizeof (S) * 3); /* { dg-warning "will always overflow" "memset" } */  struct T { char a[8]; char b[4]; char c[10]; } t;  stpcpy (t.c,"Testing..."); /* { dg-warning "will always overflow" "stpcpy" } */  char b1[7];  char b2[4];  memset (b1, 0, sizeof (b1));  memset (b2, 0, sizeof (b1)); /* { dg-warning "will always overflow" "memset" } */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -