aboutsummaryrefslogtreecommitdiff
path: root/test/Sema/format-strings-fixit.c
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2011-12-10 13:20:11 +0000
committerHans Wennborg <hans@hanshq.net>2011-12-10 13:20:11 +0000
commit6fcd932dfd6835f70cc00d6f7c6789793f6d7b66 (patch)
tree2ee0188182bc788b5a2ad7707914e8850c36ac83 /test/Sema/format-strings-fixit.c
parente7edf30143e565574c9bed0f1dbeaa47bb9a0891 (diff)
Check that arguments to a scanf call match the format specifier,
and offer fixits when there is a mismatch. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146326 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Sema/format-strings-fixit.c')
-rw-r--r--test/Sema/format-strings-fixit.c75
1 files changed, 70 insertions, 5 deletions
diff --git a/test/Sema/format-strings-fixit.c b/test/Sema/format-strings-fixit.c
index bfb54327b7..4fb6d75d76 100644
--- a/test/Sema/format-strings-fixit.c
+++ b/test/Sema/format-strings-fixit.c
@@ -10,6 +10,11 @@
int printf(char const *, ...);
+typedef __SIZE_TYPE__ size_t;
+typedef __INTMAX_TYPE__ intmax_t;
+typedef __UINTMAX_TYPE__ uintmax_t;
+typedef __PTRDIFF_TYPE__ ptrdiff_t;
+
void test() {
// Basic types
printf("%s", (int) 123);
@@ -47,11 +52,6 @@ void test() {
unsigned long val = 42;
printf("%X", val);
- typedef __SIZE_TYPE__ size_t;
- typedef __INTMAX_TYPE__ intmax_t;
- typedef __UINTMAX_TYPE__ uintmax_t;
- typedef __PTRDIFF_TYPE__ ptrdiff_t;
-
// size_t, etc.
printf("%f", (size_t) 42);
printf("%f", (intmax_t) 42);
@@ -62,6 +62,51 @@ void test() {
printf("%ld", "foo");
}
+int scanf(char const *, ...);
+
+void test2() {
+ char str[100];
+ short shortVar;
+ unsigned short uShortVar;
+ int intVar;
+ unsigned uIntVar;
+ float floatVar;
+ double doubleVar;
+ long double longDoubleVar;
+ long longVar;
+ unsigned long uLongVar;
+ long long longLongVar;
+ unsigned long long uLongLongVar;
+ size_t sizeVar;
+ intmax_t intmaxVar;
+ uintmax_t uIntmaxVar;
+ ptrdiff_t ptrdiffVar;
+
+ scanf("%lf", str);
+ scanf("%f", &shortVar);
+ scanf("%f", &uShortVar);
+ scanf("%p", &intVar);
+ scanf("%Lf", &uIntVar);
+ scanf("%ld", &floatVar);
+ scanf("%f", &doubleVar);
+ scanf("%d", &longDoubleVar);
+ scanf("%f", &longVar);
+ scanf("%f", &uLongVar);
+ scanf("%f", &longLongVar);
+ scanf("%f", &uLongLongVar);
+
+ // Some named ints.
+ scanf("%f", &sizeVar);
+ scanf("%f", &intmaxVar);
+ scanf("%f", &uIntmaxVar);
+ scanf("%f", &ptrdiffVar);
+
+ // Perserve the original formatting for unsigned integers.
+ scanf("%o", &uLongVar);
+ scanf("%x", &uLongVar);
+ scanf("%X", &uLongVar);
+}
+
// Validate the fixes...
// CHECK: printf("%d", (int) 123);
// CHECK: printf("abc%s", "testing testing 123");
@@ -87,3 +132,23 @@ void test() {
// CHECK: printf("%ju", (uintmax_t) 42);
// CHECK: printf("%td", (ptrdiff_t) 42);
// CHECK: printf("%s", "foo");
+
+// CHECK: scanf("%s", str);
+// CHECK: scanf("%hd", &shortVar);
+// CHECK: scanf("%hu", &uShortVar);
+// CHECK: scanf("%d", &intVar);
+// CHECK: scanf("%u", &uIntVar);
+// CHECK: scanf("%f", &floatVar);
+// CHECK: scanf("%lf", &doubleVar);
+// CHECK: scanf("%Lf", &longDoubleVar);
+// CHECK: scanf("%ld", &longVar);
+// CHECK: scanf("%lu", &uLongVar);
+// CHECK: scanf("%lld", &longLongVar);
+// CHECK: scanf("%llu", &uLongLongVar);
+// CHECK: scanf("%zu", &sizeVar);
+// CHECK: scanf("%jd", &intmaxVar);
+// CHECK: scanf("%ju", &uIntmaxVar);
+// CHECK: scanf("%td", &ptrdiffVar);
+// CHECK: scanf("%lo", &uLongVar);
+// CHECK: scanf("%lx", &uLongVar);
+// CHECK: scanf("%lX", &uLongVar);