1 // RUN: %clangxx_msan -O0 -g %s -o %t && %run %t 2 // RUN: %clangxx_msan -O0 -g -DPOSITIVE %s -o %t && not %run %t |& FileCheck %s 3 4 #include <assert.h> 5 #include <iconv.h> 6 #include <stdlib.h> 7 #include <string.h> 8 #include <stdio.h> 9 #include <errno.h> 10 11 int main(void) { 12 iconv_t cd = iconv_open("ASCII", "ASCII"); 13 assert(cd != (iconv_t)-1); 14 15 char inbuf_[100]; 16 strcpy(inbuf_, "sample text"); 17 char outbuf_[100]; 18 char *inbuf = inbuf_; 19 char *outbuf = outbuf_; 20 size_t inbytesleft = strlen(inbuf_); 21 size_t outbytesleft = sizeof(outbuf_); 22 23 #ifdef POSITIVE 24 { 25 char u; 26 char *volatile p = &u; 27 inbuf_[5] = *p; 28 } 29 #endif 30 31 size_t res; 32 res = iconv(cd, 0, 0, 0, 0); 33 assert(res != (size_t)-1); 34 35 res = iconv(cd, 0, 0, &outbuf, &outbytesleft); 36 assert(res != (size_t)-1); 37 38 res = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); 39 // CHECK: MemorySanitizer: use-of-uninitialized-value 40 // CHECK: #0 {{.*}} in main {{.*}}iconv.cc:[[@LINE-2]] 41 assert(res != (size_t)-1); 42 assert(inbytesleft == 0); 43 44 assert(memcmp(inbuf_, outbuf_, strlen(inbuf_)) == 0); 45 46 iconv_close(cd); 47 return 0; 48 } 49