diff options
| author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-11-28 14:14:48 +0000 |
|---|---|---|
| committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-11-28 14:14:48 +0000 |
| commit | 9c1f8323ae537bf3a84a6f00ce3b15d99bacc124 (patch) | |
| tree | 3afcc2b4048ce2df816e5ddf0c05d6b0dda64512 /compiler-rt/lib/msan/lit_tests/iconv.cc | |
| parent | 25ecfcf00cc1c06a3c4743b29dc0ea6749adabc1 (diff) | |
| download | bcm5719-llvm-9c1f8323ae537bf3a84a6f00ce3b15d99bacc124.tar.gz bcm5719-llvm-9c1f8323ae537bf3a84a6f00ce3b15d99bacc124.zip | |
[sanitizer] Intercept iconv.
llvm-svn: 195917
Diffstat (limited to 'compiler-rt/lib/msan/lit_tests/iconv.cc')
| -rw-r--r-- | compiler-rt/lib/msan/lit_tests/iconv.cc | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/compiler-rt/lib/msan/lit_tests/iconv.cc b/compiler-rt/lib/msan/lit_tests/iconv.cc new file mode 100644 index 00000000000..e7c30edd985 --- /dev/null +++ b/compiler-rt/lib/msan/lit_tests/iconv.cc @@ -0,0 +1,48 @@ +// RUN: %clangxx_msan -m64 -O0 -g %s -o %t && %t +// RUN: %clangxx_msan -m64 -O0 -g -DPOSITIVE %s -o %t && not %t |& FileCheck %s + +#include <assert.h> +#include <iconv.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <errno.h> + +int main(void) { + iconv_t cd = iconv_open("ASCII", "ASCII"); + assert(cd != (iconv_t)-1); + + char inbuf_[100]; + strcpy(inbuf_, "sample text"); + char outbuf_[100]; + char *inbuf = inbuf_; + char *outbuf = outbuf_; + size_t inbytesleft = strlen(inbuf_); + size_t outbytesleft = sizeof(outbuf_); + +#ifdef POSITIVE + { + char u; + char *volatile p = &u; + inbuf_[5] = *p; + } +#endif + + size_t res; + res = iconv(cd, 0, 0, 0, 0); + assert(res != (size_t)-1); + + res = iconv(cd, 0, 0, &outbuf, &outbytesleft); + assert(res != (size_t)-1); + + res = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); + // CHECK: MemorySanitizer: use-of-uninitialized-value + // CHECK: #0 {{.*}} in main {{.*}}iconv.cc:[[@LINE-2]] + assert(res != (size_t)-1); + assert(inbytesleft == 0); + + assert(memcmp(inbuf_, outbuf_, strlen(inbuf_)) == 0); + + iconv_close(cd); + return 0; +} |

