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