113 lines · c
1// RUN: %clang_dfsan %s -o %t && %run %t2 3#include <assert.h>4#include <stdio.h>5 6int main(int argc, char *argv[]) {7 {8 char buf[256] = "10000000000-100000000000 rw-p 00000000 00:00 0";9 long rss = 0;10 // This test exposes a bug in DFSan's sscanf, that leads to flakiness11 // in release_shadow_space.c (see12 // https://github.com/llvm/llvm-project/issues/91287)13 int r = sscanf(buf, "Garbage text before, %ld, Garbage text after", &rss);14 assert(r == 0);15 }16 17 // Testing other variations of sscanf behavior.18 {19 int a = 0;20 int b = 0;21 int r = sscanf("abc42 cat 99", "abc%d cat %d", &a, &b);22 assert(a == 42);23 assert(b == 99);24 assert(r == 2);25 }26 27 {28 int a = 0;29 int b = 0;30 int r = sscanf("abc42 cat 99", "abc%d dog %d", &a, &b);31 assert(a == 42);32 assert(r == 1);33 }34 35 {36 int a = 0;37 int b = 0;38 int r = sscanf("abx42 dog 99", "abc%d dog %d", &a, &b);39 assert(r == 0);40 }41 42 {43 int r = sscanf("abx", "abc");44 assert(r == 0);45 }46 47 {48 int r = sscanf("abc", "abc");49 assert(r == 0);50 }51 52 {53 int n = 0;54 int r = sscanf("abc", "abc%n", &n);55 assert(n == 3);56 assert(r == 0);57 }58 59 {60 int n = 1234;61 int r = sscanf("abxy", "abcd%n", &n);62 assert(n == 1234);63 assert(r == 0);64 }65 66 {67 int a = 0;68 int n = 1234;69 int r = sscanf("abcd99", "abcd%d%n", &a, &n);70 assert(a == 99);71 assert(n == 6);72 assert(r == 1);73 }74 75 {76 int n = 1234;77 int r = sscanf("abcdsuffix", "abcd%n", &n);78 assert(n == 4);79 assert(r == 0);80 }81 82 {83 int n = 1234;84 int r = sscanf("abxxsuffix", "abcd%n", &n);85 assert(n == 1234);86 assert(r == 0);87 }88 89 {90 int a = 0;91 int b = 0;92 int n = 1234;93 int r = sscanf("abcd99 xy100", "abcd%d xy%d%n", &a, &b, &n);94 assert(a == 99);95 assert(b == 100);96 assert(n == 12);97 assert(r == 2);98 }99 100 {101 int a = 0;102 int b = 0;103 int n = 1234;104 int r = sscanf("abcd99 xy100", "abcd%d zz%d%n", &a, &b, &n);105 assert(a == 99);106 assert(b == 0);107 assert(n == 1234);108 assert(r == 1);109 }110 111 return 0;112}113