brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · abd4689 Raw
133 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.cstring,alpha.unix.cstring,debug.ExprInspection -verify %s2 3typedef decltype(sizeof(int)) size_t;4void clang_analyzer_eval(bool);5 6char *strncpy(char *dest, const char *src, size_t x);7 8constexpr int initB = 100;9struct Base {10  int b;11  Base(): b(initB) {}12};13 14// issue 14380715struct strncpyTestClass: public Base {16  int *m_ptr;17  char m_buff[1000];18 19  void KnownLen(char *src) {20    m_ptr = new int;21    strncpy(m_buff, src, sizeof(m_buff)); // known len but unknown src size22    delete m_ptr;                         // no warning23  }24 25  void KnownSrcLen(size_t n) {26    m_ptr = new int;27    strncpy(m_buff, "xyz", n); // known src size but unknown len28    delete m_ptr;              // no warning29  }30};31 32void strncpyTest(char *src, size_t n) {33  strncpyTestClass rep;34  rep.KnownLen(src);35  rep.KnownSrcLen(n);36  clang_analyzer_eval(rep.b == initB); // expected-warning{{TRUE}}37}38 39size_t strlcpy(char *dest, const char *src, size_t size);40 41struct strlcpyTestClass: public Base {42  int *m_ptr;43  char m_buff[1000];44 45  void KnownLen(char *src) {46    m_ptr = new int;47    strlcpy(m_buff, src, sizeof(m_buff)); // known len but unknown src size48    delete m_ptr;                         // no warning49  }50 51  void KnownSrcLen(size_t n) {52    m_ptr = new int;53    strlcpy(m_buff, "xyz", n); // known src size but unknown len54    delete m_ptr;              // no warning55  }56};57 58void strlcpyTest(char *src, size_t n) {59  strlcpyTestClass rep;60  rep.KnownLen(src);61  rep.KnownSrcLen(n);62  clang_analyzer_eval(rep.b == initB); // expected-warning{{TRUE}}63}64 65char *strncat(char *s1, const char *s2, size_t n);66 67struct strncatTestClass: public Base {68  int *m_ptr;69  char m_buff[1000];70 71  void KnownLen(char *src) {72    m_ptr = new int;73    strncat(m_buff, src, sizeof(m_buff) - 1); // known len but unknown src size74    delete m_ptr;                         // no warning75  }76 77  void KnownSrcLen(size_t n) {78    m_ptr = new int;79    strncat(m_buff, "xyz", n); // known src size but unknown len80    delete m_ptr;              // no warning81  }82};83 84void strncatTest(char *src, size_t n) {85  strncatTestClass rep;86  rep.KnownLen(src);87  rep.KnownSrcLen(n);88  clang_analyzer_eval(rep.b == initB); // expected-warning{{TRUE}}89}90 91struct strncatReportOutOfBoundTestClass {92  int *m_ptr;93  char m_buff[1000];94 95  void KnownLen(char *src) {96    m_ptr = new int;97    // expected-warning@+1{{String concatenation function overflows the destination buffer}}98    strncat(m_buff, src, sizeof(m_buff)); // known len but unknown src size99    delete m_ptr;                         // no warning100  }101};102 103void strncatReportOutOfBoundTest(char *src, size_t n) {104  strncatReportOutOfBoundTestClass rep;105  rep.KnownLen(src);106}107 108size_t strlcat(char *dst, const char *src, size_t size);109 110struct strlcatTestClass: public Base {111  int *m_ptr;112  char m_buff[1000];113 114  void KnownLen(char *src) {115    m_ptr = new int;116    strlcat(m_buff, src, sizeof(m_buff)); // known len but unknown src size117    delete m_ptr;                         // no warning118  }119 120  void KnownSrcLen(size_t n) {121    m_ptr = new int;122    strlcat(m_buff, "xyz", n); // known src size but unknown len123    delete m_ptr;              // no warning124  }125};126 127void strlcatTest(char *src, size_t n) {128  strlcatTestClass rep;129  rep.KnownLen(src);130  rep.KnownSrcLen(n);131  clang_analyzer_eval(rep.b == initB); // expected-warning{{TRUE}}132}133